golang的切片是值类型还是引用类型?
go的切片
在某些场景下表现为引用类型: 比如可以将一个切片传入函数,在函数里修改切片的值,函数外部是能感知到的。
在某些情况下表现为值类型,比如 将切片传入函数,在函数里对切片新增值。函数外部是感知不到的。
可能的解释:
单纯的修改值,并不发生扩容。而对切片进行新增值,触发了扩容,导致地址变更。
那么如果提前将切片扩容后,再传入函数进行新增值,新增值不会触发扩容,此时函数外部能感知到吗?
所以切片究竟是值类型还是引用类型?
在某些场景下表现为引用类型: 比如可以将一个切片传入函数,在函数里修改切片的值,函数外部是能感知到的。
在某些情况下表现为值类型,比如 将切片传入函数,在函数里对切片新增值。函数外部是感知不到的。
可能的解释:
单纯的修改值,并不发生扩容。而对切片进行新增值,触发了扩容,导致地址变更。
那么如果提前将切片扩容后,再传入函数进行新增值,新增值不会触发扩容,此时函数外部能感知到吗?
所以切片究竟是值类型还是引用类型?
全部评论

golang理论上全都是值引用,之所以修改值传递的切片会改变原切片是因为切片的底层实现,是一个指针
说到底是个结构体类型 看看源码呗 这玩意儿源码很简单
切片是值传递的吧,你说的表现为引用类型,那是因为传的副本和原切片使用的是同一个底层数组,所以修改切片的值也就改变了底层数组的值,原切片的值也就改变了
相关推荐