1. 程式人生 > >go基礎語法-指針

go基礎語法-指針

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基礎語法-指針