结构体
结构体
结构体概念
- 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 协议》,转载必须注明作者和本文链接
推荐文章: