Go- 结构体
发布于: 50 分钟前
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
版权声明: 本文为 InfoQ 作者【HelloBug】的原创文章。
原文链接:【http://xie.infoq.cn/article/df7ded532f96d1165497f3fae】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
HelloBug
关注
还未添加个人签名 2018.09.20 加入
还未添加个人简介
评论