首頁 後端開發 Golang go語言結構體詳解

go語言結構體詳解

Nov 29, 2019 pm 03:36 PM
go語言

go語言結構體詳解

定義:是一種聚合的資料型別,是由零個或多個任意型別的值聚合成的實體。

成員:每個值稱為結構體的成員。

範例:

用結構體的經典案例處理公司的員工訊息,每個員工資訊包含一個唯一的員工編號、員工的名字、家庭住址、出生日期、工作、薪資、上級領導等等。所有的這些資訊都需要綁定到一個實體中,可以作為一個整體單元被複製,作為函數的參數或回傳值,或是被儲存到數組中,等等。

定義結構體:

type Employee struct {
    ID        int
    Name      string
    Address   string
    DoB       time.Time
    Position  string
    Salary    int
    ManagerID int
}
登入後複製

定義變數:

var dilbert Employee
登入後複製

存取成員:

dilbert.Salary -= 5000
登入後複製

取成員位址:

position := &dilbert.Position
*position = "Senior " + *position
登入後複製

點運算子與指向結構體的指標:

var employeeOfTheMonth *Employee = &dilbert
employeeOfTheMonth.Position += " (proactive team player)"
登入後複製

成員定義順序:

通常一行對應一個結構體成員,成員的名字在前類型在後,不過如果相鄰的成員類型如果相同的話可以被合併到一行,就像下面的Name和Address成員那樣

type Employee struct {
    ID            int
    Name, Address string
    DoB           time.Time
    Position      string
    Salary        int
    ManagerID     int
}
登入後複製

成員命名規則:

如果結構體成員名字是以大寫字母開頭的,那麼該成員就是導出的;這是Go語言導出規則決定的。一個結構體可能同時包含匯出和未匯出的成員。

匯出意義:在其他套件中可進行讀寫。

一個命名為S的結構體類型將不能再包含S類型的成員:因為一個聚合的值不能包含它本身。 (這個限制同樣適應於陣列。)但是S類型的結構體可以包含*S指標類型的成員,這可以讓我們建立遞歸的資料結構,例如鍊錶和樹結構等。

type tree struct {
    value       int
    left, right *tree
}
登入後複製

結構體面值:

可以指定每個成員的值。

type Point struct{ X, Y int }
p := Point{1, 2}
登入後複製

上面的是第一種寫法,要求以結構體成員定義的順序為每個結構體成員指定一個面值。也可以:

anim := gif.GIF{LoopCount: nframes}
登入後複製

以成員名字和對應的值來初始化,可以包含部分或全部的成員;在這種形式的結構體面值寫法中,如果成員被忽略的話將預設用零值。因為,提供了成員的名字,所有成員出現的順序並不重要。

注意:兩種不同形式的寫法不能混合使用。

結構體嵌入與匿名成員:

type Point struct {
    X, Y int
}

type Circle struct {
    Center Point
    Radius int
}

type Wheel struct {
    Circle Circle
    Spokes int
}
登入後複製

存取每個成員:

var w Wheel
w.Circle.Center.X = 8
w.Circle.Center.Y = 8
w.Circle.Radius = 5
w.Spokes = 20
登入後複製

在次簡化結構體定義:

type Circle struct {
    Point
    Radius int
}

type Wheel struct {
    Circle
    Spokes int
}
登入後複製

得意於匿名嵌入的特性,我們可以直接存取葉子屬性而不需要給出完整的路徑:

var w Wheel
w.X = 8            // equivalent to w.Circle.Point.X = 8
w.Y = 8            // equivalent to w.Circle.Point.Y = 8
w.Radius = 5       // equivalent to w.Circle.Radius = 5
w.Spokes = 20
登入後複製

結構體字面值必須遵循形狀類型聲明時的結構,所以只能用下面的兩種語法,它們彼此是等價的:

w = Wheel{Circle{Point{8, 8}, 5}, 20}

w = Wheel{
    Circle: Circle{
        Point:  Point{X: 8, Y: 8},
        Radius: 5,
    },
    Spokes: 20, // NOTE: trailing comma necessary here (and at Radius)
}
登入後複製

結構體tag:

在結構體宣告中,Year和Color成員後面的字串面值是結構體成員Tag

type Movie struct {
    Title  string
    Year   int  `json:"released"`
    Color  bool `json:"color,omitempty"`
    Actors []string
}

var movies = []Movie{
    {Title: "Casablanca", Year: 1942, Color: false,
        Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
    {Title: "Cool Hand Luke", Year: 1967, Color: true,
        Actors: []string{"Paul Newman"}},
    {Title: "Bullitt", Year: 1968, Color: true,
        Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
    // ...
}
登入後複製

這樣的資料結構特別適合JSON格式,在兩種之間相互轉換也很容易。將一個Go語言中類似movies的結構體slice轉為JSON的過程叫編組(marshaling)。編組透過呼叫json.Marshal函數完成:

data, err := json.Marshal(movies)
if err != nil {
    log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", data)
登入後複製

Marshal函數回饋一個編碼後的位元組slice,包含很長的字串,並且沒有空白縮排;我們將它折行以便於顯示:

[{"Title":"Casablanca","released":1942,"Actors":["Humphrey Bogart","Ingr
id Bergman"]},{"Title":"Cool Hand Luke","released":1967,"color":true,"Ac
tors":["Paul Newman"]},{"Title":"Bullitt","released":1968,"color":true,"
Actors":["Steve McQueen","Jacqueline Bisset"]}]
登入後複製

其中Year名字的成員在編碼後變成了released,還有Color成員編碼後變成了小寫字母開頭的color。這是因為構體成員Tag所導致的。一個構體成員Tag是和在編譯階段關聯到該成員的元資訊字串:

Year  int  `json:"released"`
Color bool `json:"color,omitempty"`
登入後複製

結構體的成員Tag可以是任意的字串面值,但通常是一系列用空格分隔的key :"value"鍵值對序列;因為值中含義雙引號字符,因此成員Tag一般用原生字串面值的形式書寫。

更多go語言知識請關注go語言教學專欄。

以上是go語言結構體詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? 在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? Apr 02, 2025 pm 05:03 PM

Go編程中的資源管理:Mysql和Redis的連接與釋放在學習Go編程過程中,如何正確管理資源,特別是與數據庫和緩存�...

See all articles