//首先定义一个结构体
type mlgb struct {
a int
b int
}
复制代码
方式一:
var v mlgb //开辟了内存空间并初始化了成员的值
fmt.Printf("%v,%T\n",v,v) //输出:{0 0},main.mlgb 可以看到此时v是一个mlgb类型的值
v.a = 1 //这里可以直接对v的成员赋值
v.b = 2
fmt.Println(v) //输出:{1 2}
复制代码
方式二:
v := new(mlgb) //开辟了内存空间并初始化了成员的值
fmt.Printf("%v,%T\n",v,v) //输出:&{0 0},*main.mlgb 此时v是一个mlgb类型的指针变量 注意这个v变量和上述方式一中的v的区别
v.a = 1 //v虽然是指针类型但是使用方式和上述方式一相同
v.b = 2
fmt.Println(v) //输出:&{1 2} 注意这里与上述方式一中的区别多了一个"&",代表这是一个指针类型的变量
复制代码
方式三:
v := &mlgb{} //这种方式等同v := new(mlgb)即等同上述的方式二
fmt.Printf("%v,%T\n",v,v) //输出:&{0 0},*main.mlgb
v.a = 1
v.b = 2
fmt.Println(v) //输出:&{1 2}
复制代码
方式四:
var v *mlgb //申明了一个mlgb类型的指针变量,此时内存中只开辟了v这个指针变量的内存但并没有为mlgb类型值开辟内存空间及初始化成员变量
fmt.Printf("%v,%T\n",v,v) //输出:<nil>,*main.mlgb 可以看到变量初始值为nil,类型为mglb类型的指针
v = &mlgb{} //此时的v变量是无法直接使用的,必须实例化一个mlgb类型的值并将他的指针赋值给v才能正常使用
fmt.Printf("%v,%T\n",v,v) //输出:&{0 0},*main.mlgb 可以看到此时mlgb已经被实例化了
fmt.Printf("%p\n",v) //输出:0xc00000a0f0 v实际的值是一个指向mlgb值的内存地址
(*v).a = 1 //现在就可以正常使用了等同v.a = 1
(*v).b = 2 //等同v.b = 2
fmt.Println(v) //&{1 2}
复制代码