Go 如何优雅地保证安全

Go 如何优雅地保证安全,go,slice,Go,Slice,输出将是 旧片是[10203005060] 新切片为[30 40] 老片是[102030407060] 新切片为[30 40 70] 老片是[102030407060] 新切片为[30 40 70 80] 附加具有不同的行为。我知道为什么会有不同的行为。因为当新的片容量大于长度时,新的和旧的共享阵列,但是追加80,容量不够大,所以它创建了一个新的阵列。因此,检查容量以避免附加具有不同的行为,或者我可以定义新的切片newSlice:=slice[2:4:4] 有什么优雅的解决方案吗?因为每次追加

输出将是

旧片是[10203005060]
新切片为[30 40]
老片是[102030407060]
新切片为[30 40 70]
老片是[102030407060]
新切片为[30 40 70 80]
附加具有不同的行为。我知道为什么会有不同的行为。因为当新的片容量大于长度时,新的和旧的共享阵列,但是追加80,容量不够大,所以它创建了一个新的阵列。因此,检查容量以避免附加具有不同的行为,或者我可以定义新的切片
newSlice:=slice[2:4:4]


有什么优雅的解决方案吗?因为每次追加之前的检查都有点难看,在某些情况下,我希望新旧用户可以一直共享该片段。如何让事情变得优雅?

这是一个非常好的随机切片信息来源:

在这种情况下,我建议先创建一个新的切片,然后每次都添加元素,如下所示:

slice := []int{10, 20, 30, 40, 50,60}

newSlice := slice[2:4:5]



fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

newSlice = append(newSlice,70)

fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

newSlice = append(newSlice,80)

fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)
其结果是:

slice := []int{10, 20, 30, 40, 50, 60}

newSlice := make([]int, 0)
newSlice = append(newSlice, slice[2:4:5]...)

fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

newSlice = append(newSlice, 70)

fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

newSlice = append(newSlice, 80)

fmt.Printf("old slice is %d \n", slice)
fmt.Printf("new slice is %d \n", newSlice)

要强制在append中分配新的后备数组,请使用长度和容量相等的切片。创建具有三个值的切片

如问题中所述,您还可以使用以下方法创建长度和容量相等的切片:

newSlice = append(newSlice[:len(newSlice):len(newSlice)], 70)

.

如果您需要依赖容量,这是一种代码气味。安排容量应纯粹是为了效率/性能,而不是为了代码的有效性。您最有可能使用不同的切片,或者如果这是您的问题,则不使用切片。如果我希望新切片和旧切片可以共享阵列,如果新切片的容量不足,请扩展这两个切片,并确保这两个切片共享同一阵列。要求很奇怪,我是围棋初学者,只是希望知道如何编写围棋风格的代码。
newSlice = append(newSlice[:len(newSlice):len(newSlice)], 70)
newSlice := slice[2:4:4]