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