写点什么

Go- 结构体

用户头像
HelloBug
关注
发布于: 50 分钟前
Go- 结构体

Go 学习笔记,学习内容《Go入门指南》


主要介绍以下内容:

  • 结构体的声明和赋值

  • 结构体类型转换

  • 结构体工厂

  • new 和 make 作用于结构体

  • 带标签的结构体

  • 匿名字段和内嵌结构体


代码示例可以直接运行

package main
import ( "fmt" "reflect" // 通过reflect包获得结构体的字段标签)
func printDivider(str ...string) { fmt.Println() fmt.Println("-----------------------------------------------") if len(str) > 0 { fmt.Println(str) }}
type pos struct { x int y int}
type number struct { f float64}
type nr number
type Student struct { name string age uint8}
type MyMap map[string]string
type WithTag struct { house string "I want a big house" car int "And TWO cars"}
type A struct { name string age uint8}
type B struct { addr string tel string int // 匿名字段,因为匿名字段使用类型来表示,所以一个结构体里一种类型的匿名字段只能有一个 A // 内嵌结构体}
type C struct { name string // 继承A的字段,但是根据当前类型实例获得name字段时,获得的是C实例的name字段 A}
func main() { /* 结构体的声明和赋值 */ printDivider("结构体的声明和赋值") var s1 pos s1.x = 1 s1.y = 2 fmt.Println(s1) // 输出:{1 2} fmt.Printf("%v\n", s1) // 输出:{1 2} 使用 %v 格式化输出
var s2 *pos = new(pos) // 返回指向结构体的指针 s2.x = 10 // 指针和示例都是使用 . 获得指定字段 s2.y = 20 fmt.Println(s2) // 输出:&{10 20} fmt.Println(*s2) // 输出:{10 20}
var s3 = pos{100, 200} // 内部使用new申请内存;数字顺序即字段顺序,x=100, y=200; new(Type) 等价于 &Type{} fmt.Println(s3) // 输出:{100 200}
s4 := pos{y: 3, x: 4} // 指定字段赋值 fmt.Println(s4) // 输出:{4 3}
s5 := pos{y: 99} // 输出:{0 99} fmt.Println(s5)
/* 结构体类型转换 */ printDivider("结构体类型转换") f1 := number{3.14} f2 := nr{6.28} //var f3 float64 = f1 // 编译错误:cannot use f1 (type number) as type float64 in assignment //var f3 = float64(f2) // 编译错误:cannot convert f2 (type nr) to type float64 var f3 = number(f2) fmt.Println(f1, f2, f3) // 输出:{3.14} {6.28} {6.28}
/* 结构体工厂 */ printDivider("结构体工厂") stu := NewStudent("Marry", 15) fmt.Println(stu) // 输出:&{Marry 15} stu.age = 18 fmt.Println(stu) // 输出:&{Marry 18}
/* new和make作用于结构体 */ printDivider("") stu1 := new(Student) // new申请内存,内存大小为Student整个实例,然后返回结构体指针 stu1.name = "Eason" stu1.age = 8 fmt.Println(stu1)
//stu2 := make(Student) // 编译错误:cannot make type Student make仅能作用于 slice, map, channel w := new(MyMap) // w 的类型: *MyMap t := make(map[int]string) // t的类型: map[int]string l := new(map[int]string) // l 的类型 *map[int]string //w = l 编译错误:cannot use l (type *map[int]string) as type *MyMap in assignment fmt.Println(w, t, l) // 输出:&map[] map[] &map[]
/* 带标签的结构体 */ printDivider("带标签的结构体") dream := WithTag{"villa", 2} tag1 := reflect.TypeOf(dream).Field(0).Tag tag2 := reflect.TypeOf(dream).Field(1).Tag fmt.Println(tag1, tag2) // 输出:I want a big house And TWO cars
/* 匿名字段和内嵌结构体 */ printDivider("匿名字段和内嵌结构体") a := A{"Marry", 12} // 输出:{Marry 12} fmt.Println(a) b := B{"Hangzhou", "16178912344", 5, A{"Lily", 13}} fmt.Println(b) // 输出:{Hangzhou 16178912344 5 {Lily 13}} fmt.Println(b.addr, b.tel, b.int, b.name, b.age) // 输出:Hangzhou 16178912344 5 Lily 13 c := C{"Mark", a} fmt.Println(c.name) // 输出:Mark}
func NewStudent(name string, age uint8) *Student { return &Student{name, age}}
复制代码


发布于: 50 分钟前阅读数: 3
用户头像

HelloBug

关注

还未添加个人签名 2018.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Go- 结构体