Go 語言中提取欄位和方法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。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 次點擊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.