美文网首页
Golang学习笔记-结构体

Golang学习笔记-结构体

作者: 土豆吞噬者 | 来源:发表于2019-09-27 19:01 被阅读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
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Golang学习笔记-结构体

          本文链接:https://www.haomeiwen.com/subject/elbhyctx.html