Go-Struct

作者: SodaCrush | 来源:发表于2021-04-02 21:01 被阅读0次

    自定义类型

    //将NewString定义为string类型
    type NewString string
    

    类型别名

    type byte = uint8
    type rune = int32
    

    go 结构体

    Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体

    定义结构体

    type StructName struct {
        field1 fieldType
        field2 fieldType
        …
    }
    
    type person struct {
        name string
        city string
        age  int8
    }
    

    创建指针类型结构体

    可以通过new函数进行实例化,得到一个结构体的指针

    var p2 = new(person)
    fmt.Printf("%T\n", p2)     //*main.person
    fmt.Printf("p2=%#v\n", p2) //p2=&main.person{name:"", city:"", age:0}
    

    结构体实例化的三种方式

    // 方式1
    var p1 person
    // 方式2
    // var p2 = new(person)
    // 方式2
    // var p3 := &person{}
    
    p1.name = "name"
    p1.age = 18
    p1.city = "city"
    fmt.Printf("p1=%#v\n", p1) //p1=&main.person{name:"name", city:"city", age:18}
    

    结构体初始化

    没有初始化的结构体,结构体字段的值都是对应类型的0值, 例如:
    var p1 person

    • 方式1,通过.的方式对字段直接赋值进行初始化
    p1.name = "name"
    p1.age = 18
    p1.city = "city"
    
    • 方式2,通过键值对赋值的方式初始化
    p1 := person{
        name: "name",
        city: "city",
        age:  18,
    }
    
    • 方式3,通过结构体指针进进行初始化
    p1 := &person{
        name: "name",
        city: "city",
        age:  18,
    }
    
    • 方式4,根据字段的顺序,直接传入对应的值
    p1 := &person{"name", "city", 18}
    

    空结构体

    // 空结构体不占用空间
    var person struct{}
    fmt.Println(unsafe.Sizeof(person))  // 0
    

    方法的定义

    func (receiver receiverType) methodName(params) (returnValueType) {
        ...
    }
    

    方法接收者

    指定接收者,相当于python中传入self

    1. 接收者的两种类型:
    • 值类型接收者
    • 指针类型接收者
    1. 指针类型作为方法接收者使用场景:
      如果用到了指针接收者,为保证代码一致性,那么应尽量保证其他方法也都使用指针类型的接收者,不应混用
    • 需要修改接收者的字段值(属性值)
    • 比较大的结构体作为接收者传入

    嵌套结构体

    // Address 结构体
    type Address struct {
        Province string
        City     string
    }
    
    // User 结构体
    type User struct {
        Name    string
        Gender  string
        Address // 匿名字段, 可省略类型, 也可传入指针类型的 *Address
    }
    

    嵌套结构体的查找顺序

    当访问结构体属性或方法时,先在当前结构体中查找该字段,若未找到再去嵌套的匿名字段中查找。

    嵌套结构体适用场景

    虽然golang没有像其他语言一样比较明确的使用面向对象,但嵌套结构体可理解为其他语言中的继承。

    相关文章

      网友评论

          本文标题:Go-Struct

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