1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | package main import "fmt" func main(){ //数组 var a = [3]int{} //相当于[3]int{0,0,0} a[0] = 1 changeArray(a) fmt.Println(a) b := [...]int{1,2,3} //省略号符号表示让编译器根据后面初始化情况自动计算数组的长度,但这个长度是编译时确定的 fmt.Println(b) c := new([3]int) //new 返回的是地址,但是一样可以用 pointName[index] 访问,但是输出时需要取地址对应的值 c[1] = 17 //这里和 (*c)[1] 等效 , 但不象 c 一样支持指针运算,除非使用 unsafe 模块 fmt.Println(*c) ///////////////////////////////////////////////////////////// //切片 d := []int{0,0,0} //跟数组类似,但不指定长度 d[0] = 1 fmt.Println(d) e := make([]int,5,10) //make 只能创建 slice,map,chanel,且返回引用,new 可以创建任何类型,返回地址 e[1] = 12 fmt.Println(e) changeSlice(e) fmt.Println(e) f := *new([]int) // new 可以创建任何类型并返回地址,但不能用参数指定大小,这个方法非常不常用 f = append(f,1,2,3) fmt.Println(f) g := c[:] //基于数组创建切片,这个方法非常简单实用[:] 表示所有元素还可以用 [m:] [:n] [m:n] //对数组的一次切片操作后即返回切片 fmt.Println(g) } // 数组是传值引用,因此函数对数组的修改不影响原值 而且[3]int 和 [4]int 是不同的类型 // 如果必须要改变数组的值,需求明确指定传递数组的指针 // 例如这里用 changeArray(x *[3]int) , 调用时用 changeArray(&a) func changeArray(x [3]int){ x[1] = 100 } //切片传的是引用,因此函数对切片的修改影响原值 func changeSlice(x []int){ x[1] = 100 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package main import "fmt" func main() { v := 3 p := &v fmt.Println(v) //3 fmt.Println(p) //0xc042050080 changeV(p) changeP(p) fmt.Println(v) //10 fmt.Println(p) //0xc042050080 } //将一个变量的地址以传值的方式传入函数,虽然传递的是地址副本但指向的地址却不是副本仍是原址 //所以对它的修改会影响到变量的值 func changeV(p *int) { *p = 10 } //而修改指针本身,由于传入的是指针变量的副本,所以对它的修改不会影响到原指针变量的指向 func changeP(p *int) { p = new(int) } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 工良出品 | 长文讲解 MCP 和案例实战
· 多年后再做Web开发,AI帮大忙
· centos停服,迁移centos7.3系统到新搭建的openEuler
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 上周热点回顾(4.14-4.20)