這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。struct 是一系列包含名稱和類型的欄位。通常就像這樣:```gopackage mainimport "fmt"type Person struct {name stringage int32}func main() {person := Person{name: "Michał", age: 29}fmt.Println(person) // {Michał 29}}```(在這篇博文的接下來部分,我將逐步刪除包名、匯入和主函數的定義)上面的結構體中,每個欄位都有明確的名字。Go 語言也允許不指定欄位名稱。沒有名稱的欄位稱為匿名欄位或者內嵌欄位。類型的名字(如果有包名,不包含這個首碼的包名)就作為欄位的名字。因為結構體中要求至少有一個唯一的欄位名,所以我們不能這樣做:```goimport ("net/http")type Request struct{}type T struct {http.Request // field name is "Request"Request // field name is "Request"}```如果編譯,編譯器將拋出錯誤:```> go install github.com/mlowicki/sandbox# github.com/mlowicki/sandboxsrc/github.com/mlowicki/sandbox/sandbox.go:34: duplicate field Request```帶有匿名的欄位或者方法,可以用一個簡潔的方式訪問到:```gotype Person struct {name stringage int32}func (p Person) IsAdult() bool {return p.age >= 18}type Employee struct {position string}func (e Employee) IsManager() bool {return e.position == "manager"}type Record struct {PersonEmployee}...record := Record{}record.name = "Michał"record.age = 29record.position = "software engineer"fmt.Println(record) // {{Michał 29} {software engineer}}fmt.Println(record.name) // Michałfmt.Println(record.age) // 29fmt.Println(record.position) // software engineerfmt.Println(record.IsAdult()) // truefmt.Println(record.IsManager()) // false```匿名(嵌入)的欄位和方法被調用時會自動向上提升(來找到對應的對象)。他們的行為跟常規欄位類似,但卻不能用於結構體字面值:```go//record := Record{}record := Record{name: "Michał", age: 29}```它將導致編譯器拋出錯誤:```// src/github.com/mlowicki/sandbox/sandbox.go:23: unknown Record field ‘name’ in struct literal// src/github.com/mlowicki/sandbox/sandbox.go:23: unknown Record field ‘age’ in struct literal```可以通過建立一個明確的,完整的,嵌入的結構體來達到我們的目的:```goRecord{Person{name: "Michał", age: 29}, Employee{position: "Software Engineer"}}```[來源:](https://golang.org/ref/spec#Struct_types)![](https://raw.githubusercontent.com/studygolang/gctt-images/master/promoted-fields-and-methods/promoted-fields-and-methods-in-go-1.jpg)
via: https://medium.com/golangspec/promoted-fields-and-methods-in-go-4e8d7aefb3e3
作者:Michał Łowicki 譯者:gogeof 校對:polaris1119
本文由 GCTT 原創編譯,Go語言中文網 榮譽推出
本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽
494 次點擊