這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go語言保留著C中值和指標的區別,但是對於指標繁瑣用法進行了大量的簡化,引入引用的概念。所以在Go語言中,你幾乎不用擔心會因為直接操作內寸而引起各式各樣的錯誤。Go語言的指標,基本上只剩下用於區分 byref 和 byval 語義。
首先看個簡單的例子
package mainimport "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)}
123456789101112131415161718192021 |
package mainimport "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)} |
package mainimport "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);}
1234567891011121314151617181920212223242526272829303132333435363738 |
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);} |
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()}
1234567891011121314151617181920212223242526272829 |
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 語言指標