定义结构体的格式如下:
type struct_variable_type struct {
member definition;
member definition;
...
member definition;
}
type Book struct {
id int
name string
author string
}
初始化结构体的格式如下,使用key-value的形式初始化时忽略的字段为零值。
structure_variable_type {value1, value2...valuen}
structure_variable_type { key1: value1, key2: value2..., keyn: valuen}
func main() {
fmt.Println(Book{1,"clean code","xiongya"})//{1 clean code xiongya}
fmt.Println(Book{id:100,author:"xiongya",name:"clean code"})//{100 clean code xiongya}
fmt.Println(Book{author:"xiongya",name:"clean code"})//{0 clean code xiongya}
}
不管结构体还是结构体指针,都使用.来访问结构体成员。
func main() {
book:=Book{1,"clean code","xiongya"}
bookPointer:=&book
fmt.Println(book.name)
fmt.Println(bookPointer.author)
}
Go中结构体会自动对齐,对齐大小暂时没有办法修改。
type TestStruct1 struct {
a uint8
}
type TestStruct2 struct {
a uint8
b uint16
}
func main() {
obj1:=TestStruct1{}
obj2:=TestStruct2{}
println(unsafe.Sizeof(obj1))//1
println(unsafe.Sizeof(obj2))//4
}
即使结构体指针是nil依然可以调用结构体定义的方法,所以在访问结构体成员前有必要判断指针是否为nil。
type MyStruct struct {
}
func (obj *MyStruct) testFunc(){
if obj==nil{
println("obj is nil")
}else{
println("obj not nil")
}
}
func main() {
var obj *MyStruct;
obj.testFunc()//obj is nil
}
继承
Go语言中,通过在结构体内置匿名的成员来实现继承,通过嵌入匿名的成员,我们不仅可以继承匿名成员的内部成员,而且可以继承匿名成员类型所对应的方法。
package main
import "fmt"
type Person struct {
name string
}
type Employee struct {
Person
companyName string
}
func (person Person) printName(){
fmt.Println(person.name)
}
func main() {
employee:=Employee{Person{"xy"},"big company"}
employee.printName()//xy
}
子类可以覆盖基类的方法。
package main
import "fmt"
type Person struct {
name string
}
type Employee struct {
Person
companyName string
}
func (person Person) printName(){
fmt.Println(person.name)
}
func (employee Employee) printName(){
fmt.Println(employee.companyName)
}
func main() {
employee:=Employee{Person{"xy"},"big company"}
employee.printName()//big company
}
结构体标签
Go结构体允许字段附带标签来对字段做一些标记,结构体标签由两个反单引号括起来,里面是以空格分隔的key-value对,其中value需要用双引号括起来。
结构体标签可以利用反射解析,我们可以根据不同的字段标签做不同的事情,例如结构体的序列化和反序列化。
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string `testTagKey:"hello world" testTagKey2:"hello xy"`
}
func main() {
person:=Person{"xy"}
dataType:=reflect.TypeOf(person)
for i:=0;i<dataType.NumField();i++{
field:=dataType.Field(i)
tag1:=field.Tag.Get("testTagKey")
fmt.Println(tag1)//hello world
tag2:=field.Tag.Get("testTagKey2")
fmt.Println(tag2)//hello xy
}
}
网友评论