//首先定义一个结构体
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}
复制代码