結構體
? 結構體是一種聚合的資料型別,是由零個或多個任意型別的值聚合成的物體,每個值稱為結構體的成員
結構體宣告
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" // 報錯!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549844.html
標籤:其他
