go基礎語法-指針
阿新 • • 發佈:2018-09-04
turn go基礎 不同類 poi 調用 new 函數 AMM program
1.基礎定義
golang的指針沒有cpp等語言的指針復雜,具體表現在其不可用於運算、只有值傳遞
語法:var variableName *int = memoryAddr
var a = 2
var p *int = &a
p = p + 1 //編譯器會報錯:invalid operation : ...
2.指針類型轉換
golang中不同類型的指針間不能相互轉換,例:*int、*int32、*int64
m1,m2,m3 := int(1),int32(1),int64(1) p := &m1 p32 := &m2 p64 := &m3 //下面的強制類型轉換編譯器會報錯,使用某些IDE編碼時會直接提示類型轉換錯誤 p = (*int)(p32) p = (*int)(p64) p32 = (*int32)(p) p32 = (*int32)(p64) p64 = (*int64)(p) p64 = (*int64)(p32)
3.只有值傳遞?
golang的函數調用中沒有引用傳遞的說法,只有值傳遞!在一些書籍或網上博客中講解golang指針和函數調用時存在錯誤。具體規範參見The Go Programming Language Specification中的Calls部分
傳指針可以實現類似傳引用的效果,傳指針可以改變指針指向的地址
/*
改變指針指向的地址
第一次調用testPointer後,a的值變為2
*/
var a int = 1
func testPointer(p *int){
*p = 2
}
只有值傳遞,指針本身的值是不能改變的
/* 不能改變指針本身 調用testPointer1後,b的值不會變 */ var b = new(int) func testPointer1(p *int) { p = nil }
測試代碼
package main import "fmt" /* 改變指針指向的地址 */ func testPointer(p *int) { *p =2 } /* 不能改變指針本身 */ func testPointer1(p *int) { p = nil } /* 交換變量值 */ func swapValue1(a,b *int) { *a,*b = *b,*a } func swapValue(a,b int)(int ,int) { return b,a } func main() { var a = 0 b := new(int) testPointer(&a) fmt.Println(a) fmt.Println(b) testPointer1(b) fmt.Println(b) m,n := 1,2 swapValue1(&m,&n) fmt.Println(m,n) fmt.Println(swapValue(m,n)) }
go基礎語法-指針