Golang Go语言中为啥切片赋值默认是地址呀
代码是这样的 ,要实现建立一个新的二维数组
变得要多写一行
var newserverlist [][]string
for _, addr := range serverlist {
tmpaddr=addr 这样 newserverlist 会是一个值一样的数组
for i:=0;i<len(filearr);i++{
//tmpaddr := make([]string,len(addr))
//copy(tmpaddr,addr)
tmpaddr[1] = filearr[i][0]
tmpaddr[3] = filearr[i][1]
newserverlist = append(newserverlist,tmpaddr)
fmt.Println(newserverlist)
}
}
Golang Go语言中为啥切片赋值默认是地址呀
更多关于Golang Go语言中为啥切片赋值默认是地址呀的实战教程也可以访问 https://www.itying.com/category-94-b0.html
slice 里边存了三个值:底层数组指针、长度、容量。
如果直接:tmpaddr = addr,那么你只是把切片复制了一份,其中:底层数组指针、长度、容量,都没有变化。
你的目的应该是把 serverList 这个切片复制出来一个新切片,那么这种方式是可行的:
tmpaddr := make([]string,len(addr))
copy(tmpaddr,addr)
例子:
func main() {
serverList := [][]string {
{“a”, “b”, “c”},
{“aa”, “bb”, “cc”},
}
fmt.Println(serverList[0]) // => [a b c]
changeSlice(serverList[0])
fmt.Println(serverList[0]) // => [changed b c]
}
func changeSlice(slice []string) {
slice[0] = “changed”
}
函数 changeSlice 接受了一个 slice 的复制体做实参,此复制体与原 slice 存储了相同的指向原始数组的指针,在函数 changeSlice 中修改 slice 指向数组的值,对于原 slice 也是可见的
更多关于Golang Go语言中为啥切片赋值默认是地址呀的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang(Go语言)中,切片(slice)的赋值默认是传递切片的引用(即地址),而非其值的完整拷贝,这一设计主要基于效率和内存使用的考量。
-
效率:切片是对底层数组的抽象,包含了指向数组的指针、长度和容量。如果每次切片赋值都进行值的拷贝,那么对于大型切片来说,这将导致大量的内存分配和复制操作,严重影响性能。通过传递引用,可以仅复制切片头(即指针、长度和容量),从而大幅提升效率。
-
内存使用:如果每次切片赋值都创建新的底层数组并进行拷贝,那么将会极大地增加内存的使用量,特别是在处理大数据集时。通过引用传递,多个切片可以共享同一个底层数组,从而节省内存。
-
灵活性:切片的引用传递允许函数或方法修改切片的内容,这对于许多算法和数据结构操作来说是非常有用的。例如,排序、过滤和映射等操作通常需要修改输入切片。
总的来说,Go语言中的切片赋值默认传递引用是为了提高效率和节省内存,同时保持足够的灵活性以支持各种算法和数据结构操作。这种设计反映了Go语言对性能和实用性的重视。当然,如果需要避免切片间的共享和修改,可以通过拷贝切片的内容(使用copy
函数)或创建新的切片来实现。