结构体
结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员
结构体声明
type + 结构体名 + struct + {成员列表}
⭐如果结构体成员名字是以大写字母开头的,那么该成员就是导出的。这是Go语言导出规则决 定的。一个结构体可能同时包含导出和未导出的成员。结构体名也同样适用此规则
// 声明的一个结构体picture,里面有两个成员:color和background
type Picture struct {
Color string
Background string // 首字母大写,在包外可以访问
value int // 首字母小写,只能在包内使用
}
// 声明一个picture类型的变量picture01
var picture01 Picture;
//带有字面量的声明
picture02 := Picture{
Color : "red",
Background : "img01",
value : 10000, // 只能在包内使用,包外会爆错
}
结构体使用
// 使用`变量名 + .`来访问结构体成员
fmt.Println(picture02.Color) // red
因为在Go语言中,所有的函 数参数都是值拷贝传入的,函数参数将不再是函数调用时的原始变量,因此在函数传参时,一般都是用指针的方式传参结构体
// 声明结构体Person
type Person struct {
Addr string
Car string
Company string
}
// 声明函数CheckPerson
func CheckPerson(person *Person) {
fmt.Printf("Addr: %s \nCar: %s \ncompany: %s", person.Addr, person.Car, person.Company)
}
// 声明一个Person类型的变量
person01 := person.Person{
Addr: "address01",
Car: "BMW",
Company: "HuaWei",
}
// 通过指针传参调用函数
CheckPerson(&person01)
/*
Addr: address01
Car: BMW
company: HuaWei
*/
嵌套结构体以及匿名成员
如果多个结构体出现重复的地方,我们会使用结构体嵌套,Go语言有一个特性让我们只声明一个成员对应的数据类型而不指名成员的名字,这类成员就 叫匿名成员。匿名成员的数据类型必须是命名的类型或指向一个命名的类型的指针。
⭐同样的如果内部嵌套的结构体首字母是以小写字母开头,那么我们同样无法在包外使用这个嵌套的结构体的成员
package pac1
type Person struct {
Addr string
Car string
company string // 小写开头,没导出,只能在包内使用
}
// 声明结构体Employee嵌套Person
type Employee struct {
EmployeeName string
EmployeeAge int
employeeSalary int // 小写开头,没导出,只能在包内使用
Person // 这个Person也叫匿名变量,访问时可以直接来访问内部成员
}
// 结构体字面值必须遵循形状类型声明时的结构,所以在使用字面值初始化时,必须遵循这个结构
robot01 := Employee{
EmployeeName: "Alice",
EmployeeAge: 20,
Person: Person{
Addr: "address01",
Car: "BMW",
company: "HuaWei",
},
}
// 在访问时可以直接访问
fmt.println(robot01.Addr) // address01
// 包外环境
package pac2
import "pac1"
var robot02 pac1.employee;
// 在包外可以访问大写字母开头(导出)的成员
robot02.EmployeeName = "Bob"
// 在包外不可以访问小写字母开头(没导出)的成员
robot02.company = "Tencent" // 报错!!!
文章评论