Golang学习笔记-结构体

2019-09-27  本文已影响0人  土豆吞噬者

定义结构体的格式如下:

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
    }

}
上一篇 下一篇

猜你喜欢

热点阅读