Golang学习笔记-结构体

定义结构体的格式如下:

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
	}

}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页