美文网首页
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学习笔记-结构体

    定义结构体的格式如下: 初始化结构体的格式如下,使用key-value的形式初始化时忽略的字段为零值。 不管结构体...

  • Golang学习笔记之方法(method)

    如果对与结构体还有什么疑问的可以看一下Golang学习笔记之结构体 ⽅法总是绑定对象实例,并隐式将实例作为第⼀实参...

  • Golang 学习笔记四 结构体

    一、结构体 《快学 Go 语言》第 8 课 —— 结构体1.结构体类型的定义结构体和其它高级语言里的「类」比较类似...

  • Golang学习笔记之结构体(struct)

    传送门:Golang学习笔记之方法 结构体(struct)是用户自定义的类型,它代表若干字段的集合。 • 值类型,...

  • 知识分享之Golang——gorm的结构体常用标签

    知识分享之Golang——gorm的结构体常用标签 背景 知识分享之Golang篇是我在日常使用Golang时学习...

  • Golang笔记: 结构体(struct)

    结构体定义 go语言的关键字 type 可以将各种基本类型定义为自定义类型,包括整型、字符串、布尔等。结构体是一种...

  • Learn Golang In Day 9

    Learn Golang In Day 9 简介 结构体是自定义的数据结构 定义结构体 package main ...

  • golang 结构体

     一个结构体类型可以包含若干个字段,也可以不包含任何字段。空结构体可以关联上一些方法,从而看成是函数的特殊版本。 ...

  • Golang:结构体

    结构体 结构体(struct)是用户自定义的类型,代表若干字段的集合。有时将多个数据看做一个整体要比单独使用这些数...

  • Golang结构体

    C++中结构体(struct)和类(class)的主要区别有: struct没有权限控制字段 struct没有方法...

网友评论

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

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