一.结构体指针

  • 由于结构体是值类型,在方法传递时希望传递结构体地址,可以使用时结构体指针完成
  • 可以结合new(T)函数创建结构体指针

    1. peo := new(People)
    2. //因为结构体本质是值类型,所以创建结构体指针时已经开辟了内存空间
    3. fmt.Println(peo == nil) //输出:false
    4. //由于结构体中属性并不是指针类型,所以可以直接调用
    5. peo.Name = "smallming"
    6. fmt.Println(peo)//输出:&{smallming 0}
    7. peo1:=peo
    8. peo1.Name="佳明哥"
    9. fmt.Println(peo1,peo)//输出:&{佳明哥 0} &{佳明哥 0}
  • 如果不想使用new(T)函数,可以直接声明结构体指针并赋值

    1. //声明结构体指针
    2. var peo *People
    3. //给结构体指针赋值
    4. peo = &People{"smallming", 17}
    5. /*
    6. 上面代码使用短变量方式如下
    7. peo:= &People{"smallming", 17}
    8. */
    9. fmt.Println(peo)

二.判断

  • 结构体指针比较的是地址
  • (*结构体指针)取出地址中对应的值

    1. p1 := People{"smallming", 17}
    2. p2 := People{"smallming", 17}
    3. fmt.Printf("%p %p\n", &p1, &p2) //输出地址不同
    4. fmt.Println(p1 == p2) //输出:true
    5. p3 := new(People)
    6. p3 = &People{"smallming", 17}
    7. //结构体变量不能和指针比较,使用*指针取出地址中值
    8. fmt.Println(p1 == *p3) //输出:true
    9. p4 := &People{"smallming", 17}
    10. //指针比较的是地址
    11. fmt.Println(p3 == p4) //输出:false