Go中&与的区别以及使用

Go中&与*的区别以及使用

  • &:对变量取地址。 放到一个变量前使用就会返回相应变量的内存地址。

  • *: 是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 ,也就是这个地址所存储的值 。放在一个变量前使用就代表地址值。

package main

import "fmt"

// 声明结构体
type Person struct {
    name string
    age  int
}

func main() {

    // & 是取内存地址符,取得Person类型对象的地址
    // 声明一个 Persion 类型的结构体
    Bob := Person{"Bob", 20}
    fmt.Println("Bob", Bob, "&Bob", &Bob) // Bob {Bob 20} &Bob &{Bob 20}

    // 声明一个 Persion 类型的指针
    Lisa := &Person{"Lisa", 30}
    fmt.Println("Lisa", Lisa, "&Lisa", &Lisa) // Lisa &{Lisa 30} &Lisa 0xc00000a030

    // * 表达变量是指针类型
    var John *Person = &Person{
        name: "John",
        age:  40,
    }
    fmt.Println("John", John, "&John", &John) // John &{John 40} &John 0xc00000a038

    // * 也可以标识指针类型变量所指向的存储单元
    fmt.Println("*John", *John) // *John {John 40}

    // 函数参数是指针的话,会修改原来的数据
    changeName(John)
    fmt.Println("*John", *John)
    fmt.Println("*John", *John)
}

func changeName(p *Person) {
    // p 是是一个指针
    // 如果是基本数据类型 [p.name = "China"] == [(*p).name == "China"]
    (*p).name = "China"
    p.age = 100
}

func init() {
    var a *int    // 存储的是 int 的指针, 目前为空
    var b int = 4 // 存储的是 int 的指针, 默认是4

    a = &b // a 指向 b 的地址
    // a = b           // a 无法等于 b,会报错,a是指针,b是值,存储的类型不同

    fmt.Println(a)
    fmt.Println(*a)

    *a = 5
    fmt.Println(*a)
    fmt.Println(b)
}

Last updated