結構體 結構體是一種聚合的數據類型,是由零個或多個任意類型的值聚合成的實體。每個值稱為結構體的成員 結構體聲明 type + 結構體名 + struct + {成員列表} :star:如果結構體成員名字是以大寫字母開頭的,那麼該成員就是導出的。這是Go語言導出規則決 定的。一個結構體可能同時 ...
結構體
結構體是一種聚合的數據類型,是由零個或多個任意類型的值聚合成的實體。每個值稱為結構體的成員
結構體聲明
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" // 報錯!!!