Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。Go语言的指针,基本上只剩下用于区分 byref 和 byval 语义。
首先看个简单的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package main import "fmt" func zeroval(ival int) { ival = 0 } func zeroptr(iptr *int) { *iptr = 0 } func main() { i := 1 fmt.Println("initial:", i) zeroval(i) fmt.Println("zeroval:", i) zeroptr(&i) fmt.Println("zeroptr:", i) Pointers can be printed too. fmt.Println("pointer:", &i) } |
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 |
package main import "fmt" type Test struct{ Name string } func change2(t *Test){ t.Name = "2" } func change3(t *Test){ //注意这里括号 //如果直接*t.Name=3 编译不通过 报错 invalid indirect of t.Name (type string) //其实在go里面*可以省掉,直接类似change2函数里这样使用。 (*t).Name = "3" } func change4(t Test){ t.Name = "4" } func main() { //t是一个地址 t := &Test{Name:"1"} fmt.Println(t.Name); change2(t) fmt.Println(t.Name); change3(t) fmt.Println(t.Name); //这里传递变量用了* change4(*t) fmt.Println(t.Name); } |
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 |
package main import "fmt" type abc struct{ v int } func (a abc)aaaa(){ //传入的是值,而不是引用 a.v=1 fmt.Printf("1:%d\n",a.v) } func (a *abc)bbbb(){ //传入的是引用,而不是值 fmt.Printf("2:%d\n",a.v) a.v=2 fmt.Printf("3:%d\n",a.v) } func (a *abc)cccc(){ //传入的是引用,而不是值 fmt.Printf("4:%d\n",a.v) } func main(){ aobj:=abc{} //new(abc); aobj.aaaa() aobj.bbbb() aobj.cccc() } |
go 语言指针
有疑问加站长微信联系(非本文作者)