gpt4 book ai didi

go - 二维 slice 中追加的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 22:23:40 36 4
gpt4 key购买 nike

我对 Go 语言有点陌生,并试图构建一个函数,它将一个 slice 分割为多个大小几乎相等的 slice 。如果主 slice 的大小不适合子 slice 的数量,我计划将剩余的元素按顺序重新分配到子 slice 。

我已经构建了以下代码:

package main

import (
"fmt"
stc "strconv"
"strings"
)

func main() {
myslice := make([]int, 12)
myslice = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println("Original Slice = ", myslice)
newdiv := subslices(myslice, 4)
fmt.Println(newdiv)
}

func subslices(sl []int, dividnet int) [][]int {
var res [][]int

minsize := len(sl) / dividnet

for i := 0; i < dividnet; i++ {
res = append(res, sl[i*minsize:i*minsize+minsize])
}

for i := 0; i < dividnet; i++ {
fmt.Printf("res[%d] = %v\n", i, res[i])
}

fmt.Println(res)
if rem := len(sl) % dividnet; rem != 0 {
fmt.Println("remaining elements = ", rem)
for j := 0; j < rem; j++ {
tobeadd := sl[minsize*dividnet+j]
fmt.Println("element to be added = ", tobeadd)
fmt.Printf("res[%d] before append = %v\n", j, res[j])
res[j] = append(res[j], tobeadd)
fmt.Printf("res[%d] after append = %v\n", j, res[j])
}
}
return res
}
func gentwodim(x, y int) [][]int {
res := make([][]int, x)
for z := range res {
res[z] = make([]int, y)
}

for i := 0; i < x; i++ {
for j := 0; j < y; j++ {
res[i][j] = i + j
}
}
return res
}

Go Play 示例
sample of the above code

代码的输出如下:
res[0] = [1 2]
res[1] = [3 4]
res[2] = [5 6]
res[3] = [7 8]
[[1 2] [3 4] [5 6] [7 8]]
remaining elements = 2
element to be added = 9
res[0] before append = [1 2]
res[0] after append = [1 2 9] // up to this step the code works fine
element to be added = 10
res[1] before append = [9 4] // I did not get why res[1] is changed by replacing 3 with 9
res[1] after append = [9 4 10]
[[1 2 9] [9 4 10] [10 6] [7 8]]

然而,在添加了 res[0] after append = [1 2 9] 中显示的第一个剩余元素之后, 第 2 个子 slice 从 res[1] = [3 4] 开始改变至 res[1] before append = [9 4]我试图调试并理解我在这里遗漏或编码错误的内容,但不能。

感谢您的支持。

最佳答案

通过在 slice 时分配“额外”值来避免问题:

func subslices(sl []int, dividnet int) [][]int {
var res [][]int
var i int
for len(sl) > 0 {
i = len(sl) / (dividnet - len(res))
res = append(res, sl[:i])
sl = sl[i:]
}
return res
}

关于go - 二维 slice 中追加的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61309981/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com