# 结构体/Struct

type只是用于定义新类型,但有时候我们需要一种方式来描述一个实例。这就可以用到结构体(struct)

# 定义结构体

type T struct {
	Field1 T1
	Field2 T2
	...
	FieldN Tn
}

# 访问性

我们定义在package中的类型,假如想要在外部引用当前 package 时也能调用,就需要把类型名字改为大写开头。

package book

type Book Struct {
	Title string
	Pages int
	Indexes map[string]int
}
import ".../book"
var b book.Book
b.Title = "book name"
b.Pages = 100

# 初始化

结构体初始化时,我们可以直接给每个字段依次赋值。

type Book Struct {
	Title string
	Pages int
	Indexes map[string]int
}
func main(){
	var book := Book{"book name",100,make(map[string]int)}
}

但这种方式有两个问题:

# 1.当结构体有非导出字段时会失效

一旦结构体中有非导出字段,这种逐一赋值的方式就会报错

type Book Struct {
	Title string
	pages int //非导出(小写开头)
	Indexes map[string]int
}
func main(){
	var book := Book{"book name",100,make(map[string]int)} //  报错
}

# 2.顺序不一定如我们所想

Go 其实并不推荐我们用逐一赋值的方式初始化,因为这种方式有可能出现不如我们所想的顺序效果。

# 正确的初始化方式

为了避免上述问题,Go 推荐我们用field:value的方式初始化。

type Book Struct {
	Title string
	Pages int //非导出(小写开头)
	Indexes map[string]int
}
func main(){
	var book := Book{
		Title:"book name",
		Pages:100,
		Indexes:make(map[string]int)
	}
}