结构体

结构体

结构体概念

  • 1)将一类事务特性提取出一个新的数据类型,就是结构体。
  • 2)通过结构体可以创建多个实例。
  • 3)可以是Student结构体、可以是Animal、Person结构体。

结构体特点

  • 1)struct用于定义复杂数据结构
  • 2)struct可以包含多个字段
  • 3)struct可以定义方法(注意不是函数,是golang的method)
  • 4)struct可以是值类型
  • 5)struct类型可以嵌套
  • 6)Go没有class,只有stuct类型
  • 7)结构体是自定义类型,不得与其他类型强转
  • 8)可以为struct每一个字段添加tag,这个tag可以反射机制获取,场景如json序列化和反序列化。
    type User struct {
      UserName string  `json:"姓名"` //反引号括起来的就是struct tag
      Sex      string  `json:"性别"`
      Score    float32 `json:"成绩"`
      Age      int32   `json:"年纪"`
    }
    func main() {
      user := &User{
          UserName: "user01",
          Sex:      "男",
          Score:    99.2,
          Age:      18,
      }
      //将user变量序列化为json格式字符串
      data, _ := json.Marshal(user)
      fmt.Printf("json str:%s\n", string(data))
    }
    返回
    json str:{"姓名":"user01","性别":"男","成绩":99.2,"年纪":18}

结构体定义

type Person struct {
    Name string
    Age  int
}
func main() {
    //声明方式
    p1 := Person{"董雷", 18} //有序赋值,并且必须包含所有字段,否则报错
    p2 := Person{Age: 18}  //关键词赋值,未赋值字段有空值
    fmt.Println(p1)
    fmt.Println(p2)
}

{董雷 18}
{ 18}

结构体声明方式

第三、第四种返回结构体指针,go编译器自动识别,简化程序员心智负担,建议用1、2方法

1.结构体可以通过 . 的方式赋值,声明赋值方式一
var stu1 Stu
stu1.Name  =  "董雷"
stu1.Age  =  18
stu1.Address  =  "老三"
stu1.Score  =  100
2.声明赋值方式二
monster1 :=  Monster{"董雷",  18}
3.声明方式三
用来分配内存,主要用来分配值类型,比如int、struct。返回指向类型的 指针
此时m1是一个指针
var m1 *Monster  =  new(Monster)
//给m1赋值
(*m1).Name  =  "董雷"  //编译器自动识别 同于 m1.Name="孙悟空"
(*m1).Age  =  9999  //同上`
fmt.Println(*m1)  //此时m1是指针变量,加上*取值
4. //声明方式四
m2 :=  &Monster{
   "董雷",
   888,
}
fmt.Println(*m2)

结构体类型转换

  • 1)结构体由用户自定义,可以类型转换,但必须完全相同字段、个数、类型
  • 2)对结构体进行重新定义(重新type),效果同于结构体别名
  • 3)struct每个字段,可以写一个tag,这个tab可以通过反射获取,用在序列化,反序列化

结构体内存分配

type Person struct {
    Name string
    Age  int
}
func main() {
    //p1有自己的结构体内存地址,
    var p1 Person
    p1.Age = 30
    p1.Name = "董雷"
    //取出p1的指针赋值给另外一个指针对象
    var p2 *Person = &p1
    //查看p1和p2的内存地址
    fmt.Printf("p1内存地址%p\n", &p1)
    fmt.Printf("p2内存地址%p\n", p2)
    fmt.Printf("p2指向的值是%v \n", p1)
    fmt.Printf("p2指向的值是%v \n",*p2)
}
打印数据

因为指针赋值,所以&P1和P2的值是一样的,所以使用P2来保存p1的指针地址

p1内存地址0xc00011c018
p2内存地址0xc00011c018
p2指向的值是{董雷 30} 
p2指向的值是{董雷 30} 
本作品采用《CC 协议》,转载必须注明作者和本文链接
good good study day day up
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!