struct
数组、切片和映射对于混合不同类型的值没有帮助。它们只能保存一种类型。
一个struct(structure的简称)是一个由其他不同的多种值构造出来的。鉴于切片可能只能保存string类型,而映射可能只能保存int类型,你可以创建一个struct保存string、int、float64、bool等多种类型——所有的都在一个方便的组中。
声明
使用struct关键字来声明一个struct类型,后面跟着花括号。在括号中,你可以定义一个或多个字段:struct组合的值。每一个字段定义在一个单独的行,由字段名称、后面跟着的字段需要保存的值类型组成。
(使用已经定义好的类型来定义struct变量更加常见,但是此处我们不会涵盖更多的类型定义,所以我们先这么写。)
使用点运算符访问struct字段
我们可以使用点运算符来标识属于struct的字段。这也可以用于对它们的赋值和检索。
package main import "fmt" var stu struct{ age int name string } func main() { stu.age=12 stu.name="aaa" fmt.Printf("%#v",stu) }
- 类型定义允许你自己创建新的类型。你可以基于基础类型来创建新的定义类型。
- 为了定义一个类型,需要使用type关键字,后面跟着新类型的名字,然后是你希望基于的基础类型。如果你使用struct类型作为你的基础类型,你需要使用struct关键字,后面跟着以花括号包裹的一组字段定义,就像你声明struct变量时所做的那样。
- 就像变量,类型定义可以被放在一个函数中。但是把它的作用域限定在该函数块中,意味着你不能在函数外面使用。所以类型经常定义在函数外的包级别。
- 如果你已经在当前包定义了一个名为car的类型,并且你同时也声明了一个名为car的变量,这个变量会遮盖类型名称,使后者无法被访问。

类型遮盖是一个令人疑惑的问题,所以最好知道它是会发生的。
- 事实上,使用点运算符在struct指针和struct上都可访问字段。
package main
import "fmt"
type stu struct{
age int
name string
}
func set(p *stu) {
p.name="aa"
p.age=2
}
func main() {
p:=stu{
age: 0,
name: "",
}
set(&p)
fmt.Printf("%#v",p)
}
导出类型
- 定义类型的名称首字母必须大写才能导出该类型
package page
type Stu struct{
Age int
Name string
}
---
package main
import (
"awesomeProject/src/page"
"fmt"
)
func set(p *page.Stu) {
p.Name="aa"
p.Age=2
}
func main() {
p:= page.Stu{
Age: 0,
Name: "",
}
set(&p)
fmt.Printf("%#v",p)
}
- 如果一个类型希望在它被定义的包之外访问,它必须是被导出的:它的名字必须以大写字母开头。
- 即使一个struct类型被从包中导出,如果它的字段名称没有首字母大写的话,它的字段也不会被导出。
struct字面量
Go提供了struct字面量来让你创建一个struct并同时给它的字段赋值。
p:= page.Stu{ Age: 0, Name: "", }
将struct作为字段增加到另一个类型中
package page type Stu struct{ Age int Name string } type stu struct { s1 Stu ina int }
- 在struct类型中增加一个struct类型字段与增加其他类型字段相同。你提供一个字段名称,后面跟上字段类型
package main
import (
"awesomeProject/src/page"
"fmt"
)
type stu struct {
s1 page.Stu
ina int
}
func main() {
var s1 = stu{
s1: page.Stu{
Name: "a",
Age: 1,
},
ina: 2,
}
s1.s1.Name="b"
fmt.Printf("%#v",s1)
}
package page
type Stu struct{
Age int
Name string
}
匿名struct字段
通过外部struct访问内部struct的字段的代码有点乏味。想要访问内部struct的字段的时候,不得不每次都输入代表struct的字段的名称.
Go允许定义一个匿名字段:struct字段没有名字,仅仅有类型。我们可以使用匿名字段来让内部struct访问更加简单。
package main import ( "awesomeProject/src/page" "fmt" ) type stu struct { page.Stu ina int } func main() { var s1 = stu{ ina: 2, Stu:page.Stu{ Name: "1", Age: 2, }, } s1.Name="a" fmt.Printf("%#v",s1) }
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!





