Go-Struct

2021-04-02  本文已影响0人  SodaCrush

自定义类型

//将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

p1.name = "name"
p1.age = 18
p1.city = "city"
p1 := person{
    name: "name",
    city: "city",
    age:  18,
}
p1 := &person{
    name: "name",
    city: "city",
    age:  18,
}
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没有像其他语言一样比较明确的使用面向对象,但嵌套结构体可理解为其他语言中的继承。

上一篇下一篇

猜你喜欢

热点阅读