深入理解 go slice

看下面的几个例子:


func modifyEle(array []int) {
	for i := 0; i < len(array); i++ {
		(array)[i] = i
	}
	fmt.Printf("modify   int  array len = %d, cap = %d \n", len(array), cap(array))
}

func main() {
	array := []int{4, 3, 2, 1, 0}
	fmt.Println(array)
	
	fmt.Printf("modify befort array len = %d, cap = %d \n", len(array), cap(array))
	modifyEle(array)
	fmt.Printf("modify after  array len = %d, cap = %d \n", len(array), cap(array))
	fmt.Println(array)
}

结果:


[4 3 2 1 0]
modify befort array len = 5, cap = 5 
modify   in   array len = 5, cap = 5 
modify after  array len = 5, cap = 5 
[0 1 2 3 4]


上面这个例子中,slice 可以被修改。 再看一个例子。


func deleteEle(array []int) {
	array = array[:1]

	fmt.Printf("delete   in   array len = %d, cap = %d \n", len(array), cap(array))
}

func main() {
	array := []int{4, 3, 2, 1, 0}
	fmt.Println(array)

	fmt.Printf("delete befort array len = %d, cap = %d \n", len(array), cap(array))
	deleteEle(array)
	fmt.Printf("delete after array len = %d, cap = %d \n", len(array), cap(array))
	fmt.Println(array)
}

结果

[4 3 2 1 0]
delete befort array len = 5, cap = 5 
delete   in   array len = 1, cap = 5 
delete after  array len = 5, cap = 5 
[4 3 2 1 0]

在上面这个例子中,删除slice 里的元素好像没成功。 继续看下面的例子

func deleteEle(array *[]int) {
	*array = (*array)[:1]

	fmt.Printf("delete   in   array len = %d, cap = %d \n", len(*array), cap(*array))
}

func main() {
	array := []int{4, 3, 2, 1, 0}
	fmt.Println(array)

	fmt.Printf("delete befort array len = %d, cap = %d \n", len(array), cap(array))
	deleteEle(&array)
	fmt.Printf("delete after array len = %d, cap = %d \n", len(array), cap(array))
	fmt.Println(array)
}

结果

[4 3 2 1 0]
delete befort array len = 5, cap = 5 
delete   in   array len = 1, cap = 5 
delete after array len = 1, cap = 5 
[4]

继续看例子


func modifyEle(array []int) {
	array = append(array, 1)
	for i := 0; i < len(array); i++ {
		(array)[i] = i
	}
	fmt.Printf("modify   in   array len = %d, cap = %d \n", len(array), cap(array))
}

func main() {
	array := []int{4, 3, 2, 1, 0}
	fmt.Println(array)
	fmt.Printf("modify befort array len = %d, cap = %d \n", len(array), cap(array))
	modifyEle(array)
	fmt.Printf("modify after  array len = %d, cap = %d \n", len(array), cap(array))
	fmt.Println(array)
}

这个例子跟第一个很像,但是结果完全不同。

[4 3 2 1 0]
modify befort array len = 5, cap = 5 
modify   in   array len = 6, cap = 10 
modify after  array len = 5, cap = 5 
[4 3 2 1 0]

理解了这几个例子,就完全理解 go slice 了。

posted @   有人放学要打我  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示