Go-Struct

SodaCrush · · 357 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

自定义类型

//将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没有像其他语言一样比较明确的使用面向对象,但嵌套结构体可理解为其他语言中的继承。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:SodaCrush

查看原文:Go-Struct

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

357 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传