golang中slice的注意事项

栏目: Go · 发布时间: 5年前

内容简介:请注意, array是一个指针类型。
  1. slice本质上是基于数组的一种数据结构(struct),是数组的一种透视。
  2. slice的数据结构为:
type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

请注意, array是一个指针类型。

  1. slice作为数组的一部分透视来使用:
testArr := [5]int{0, 1, 2, 3, 4}
	sliceFromArr := testArr[1:3]
	fmt.Println(sliceFromArr)		// [1, 2]
	sliceFromArr[0] = 11
	fmt.Println(testArr)	//[0 11 2 3 4]
	fmt.Printf("len: %d, cap: %d, data:%+v \n",len(sliceFromArr), cap(sliceFromArr), sliceFromArr)
	//len: 2, cap: 4, data:[11 2]
	//修改slice同时会修改array,因为slice中有array的指针

	sliceFromArr = append(sliceFromArr, 33, 44)
	fmt.Println(testArr)			//[0 11 2 33 44]
	fmt.Printf("len: %d, cap:%d, data:%+v \n", len(sliceFromArr), cap(sliceFromArr), sliceFromArr)
	//len: 4, cap:4, data:[11 2 33 44]
	//当len小于透视的数组的length时,对slice的修改都会同时修改它透视的数组

	sliceFromArr = append(sliceFromArr, 55)
	fmt.Println(testArr)	//[0 11 2 33 44]
	fmt.Printf("len: %d, cap: %d, data:%+v \n", len(sliceFromArr), cap(sliceFromArr), sliceFromArr)
	//len: 5, cap: 8, data:[11 2 33 44 55]
	//append()当len大于cap时,会重新开辟为原来slice的cap两倍的内存空间,并把slice拷贝到新开辟的空间中。
	//所以原来的数组显示的依旧是原来的内存地址中的数据,而现在的slice已经存储来一个新开辟的8个int的空间中,
	//对slice的修改不会改动原来的数组。
  1. slice单独定义,并作为参数传递给函数:
func setSlice(testSlice []int){
	testSlice[0] = 10
	testSlice[1] = 11
}
func setSliceByAppend(testSlice []int){
	testSlice = append(testSlice, 22)
}
func setSliceByAppendPointer(testSlice *[]int){
	*testSlice = append(*testSlice, 22)
}
func main(){
	testSlice := make([]int, 2, 3)
	testSlice[0] = 0
	testSlice[1] = 1
	fmt.Printf("len: %d, cap: %d, data:%+v \n", len(testSlice), cap(testSlice), testSlice)
	//len: 2, cap: 3, data:[0 1]

	setSlice(testSlice)
	fmt.Printf("len: %d, cap: %d, data:%+v \n", len(testSlice), cap(testSlice), testSlice)
	//len: 2, cap: 3, data:[10 11]
	//因为slice中的array是指针类型所以在参数传递中,可以修改slice中array的值

	setSliceByAppend(testSlice)
	fmt.Printf("len: %d, cap: %d, data:%+v \n", len(testSlice), cap(testSlice), testSlice)
	//len: 2, cap: 3, data:[10 11]
	setSliceByAppendPointer(&testSlice)
	fmt.Printf("len: %d, cap: %d, data:%+v \n", len(testSlice), cap(testSlice), testSlice)
	//len: 3, cap: 3, data:[10 11 22]
	//由setSliceByAppend和setSliceByAppendPointer的测试可以得知,
	//使用append()来修改slice的值,会生成一个新的slice,新的slice内存地址和原来的就不一样了。
	//如果需要使用append()来修改slice的值,需要使用指针类型的slice。
}

以上所述就是小编给大家介绍的《golang中slice的注意事项》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python金融衍生品大数据分析:建模、模拟、校准与对冲

Python金融衍生品大数据分析:建模、模拟、校准与对冲

【德】Yves Hilpisch(伊夫·希尔皮斯科) / 蔡立耑 / 电子工业出版社 / 2017-8 / 99.00

Python 在衍生工具分析领域占据重要地位,使机构能够快速、有效地提供定价、交易及风险管理的结果。《Python金融衍生品大数据分析:建模、模拟、校准与对冲》精心介绍了有效定价期权的四个领域:基于巿场定价的过程、完善的巿场模型、数值方法及技术。书中的内容分为三个部分。第一部分着眼于影响股指期权价值的风险,以及股票和利率的相关实证发现。第二部分包括套利定价理论、离散及连续时间的风险中性定价,并介绍......一起来看看 《Python金融衍生品大数据分析:建模、模拟、校准与对冲》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码