Go语言结构体使用
结构体描述
结构体是由零个或多个任意类型的值构成的数据集合,属于复合类型,每个值可以称为结构体的
成员
或字段
结构体字段
有以下特性
- 字段拥有自己的类型和值
- 字段名必须唯一,不区分类型
- 字段的类型也可以是结构体,甚至是字段所在结构体的类型
结构体格式
使用type和struct语句,格式如下
type 类型名 struct {
字段1 字段1类型
字段2 字段2类型
…
}
各个部分使用说明:
- 类型名,标志自定义结构体的名称,同一个包内
唯一
- struct{},结构体类型,
type 类型名 struct{}
可以理解为将struct{}
结构体定义为类型名的类型 - 字段一...表示结构体字段名,该结构体内唯一
- 字段1类型...各个字段的类型
结构体用法
基本使用
定义一个person结构体,普通用法如下:
type person struct {
name string
age int
sex int
}
也可以把相同
的类型写在一行
type person struct {
name string
age, sex int
}
结构体实例化
只有当结构体实例化
时,才会真正分配内存,必须实例化后才能使用结构体的字段
结构体也是一种类型,可以使用var
关键字声明
var 结构体实例 结构体类型
使用案例
type Person struct {
name string
city string
age int
}
func main() {
// 实例化1,全部给了默认值
var p1 Person
p1.name = "小明"
p1.city = "北京"
p1.age = 18
fmt.Printf("p1=%v\n", p1) //p1={小明 北京 18}
// 实例化2 按照顺序初始化值,所有值必须赋值
p := Person{"小明", "北京", 18}
fmt.Println(p)
// 实例化3 指定命名参数,无视顺序,没有赋值的为默认值
p := Person{name: "小明"}
fmt.Println(p)
// 实例4 初始化为指针类型
p := new(Person)
fmt.Println(p) // &{ 0}
}
匿名结构体使用,一些临时数据可以使用
func main() {
var user struct{Name string; Age int}
user.Name = "pprof.cn"
user.Age = 18
fmt.Printf("%#v\n", user)
}
类型别名和自定义类型
自定义类型使用
我们可以使用type
关键字来自定义类型
自定义类型是一个全新的类型,可以基于内置的基本类型定义,也可以通过struct定义
//将MyInt定义为int类型
type MyInt int
全新类型MyInt
具有基本类型int
的特性
类型别名使用
类型别名规定:TypeAlias
只是Type
的别名,本质上TypeAlias与Type是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。
type TypeAlias = Type
我们之前见过的rune和byte就是类型别名,他们的定义如下:
type byte = uint8
type rune = int32
类型定义和类型别名的区别
//类型定义
type NewInt int
//类型别名
type MyInt = int
func main() {
var a NewInt
var b MyInt
fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt
fmt.Printf("type of b:%T\n", b) //type of b:int
}
结果显示a的类型是main.NewInt,表示main包下定义的NewInt类型。b的类型是int。MyInt类型只会在代码中存在,编译完成时并不会有MyInt类型。
转载自:https://juejin.cn/post/7151432979406356487