iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
自我挑戰組

跟著 Go 實戰聖經 一起自學 Go系列 第 19

DAY 19 Go 語言 匿名結構 (anonymous strut) 與比較結構

  • 分享至 

  • xImage
  •  

昨天了解了自訂型別以及結構的定義,今天就來了解結構中還有哪些其他種用法!

匿名結構(anonymous strut)

結構型別正常來說會在套件的層級就宣告,因為這樣後面各個函式都可以取用,當然你也可以將結構宣告在函式內,只是這樣這個結構就會有 scope 的問題,他只有在函式內才有效。
而定義在函式內的結構型別我們稱為 匿名結構(anonymous strut) ,他有以下三個特點:

  1. 顧名思義它 沒有名稱
  2. 在宣告時可一併賦值
  3. 只能有一個變數,無法再建立其他結構
<結構變數名稱> := struct {
    <欄位 1> <型別>
    <欄位 2> <型別>
    ...
    <欄位 N> <型別>
}{
    <值 1>,
    <值 2>,
    ...
    <值 N>,
}

補充
上方賦值我們使用沒有欄位名稱的賦值法,當然大家也可以選擇使用有欄位名稱的賦值法,只是按照慣例,在匿名結構中,我們通常習慣使用沒有欄位名稱的賦值法。

比較結構

如果結構中每個欄位都相同,且型別也相同,那就可以讓兩個結構做比較。如:我最喜歡的人是奇犽,他年紀12歲; 姊姊最喜歡的人是庫拉皮卡,他年紀17歲,那我們就可以拿這兩個以字串跟整數構成的結構來做比較,如果兩者的值相同回傳 true ,不同回傳 false 。但如果你的結構中有切片,那這兩個結構便不能做比較,因為前面介紹過的,切片與切片之間是不能相互比較的。
在鐵人賽第一天,我們便介紹了 Go 語言是一種強型別語言,也就是說需要同型別相互比較才不會出錯,但在結構這邊有特別寬鬆一點,若是欄位相同的匿名結構型別與其他結構型別,是可以兩兩相比較的!

範例 3:

package main

import "fmt"

type myFavorites struct { // 定義名為 myFavorites 的具名結構
    name string
    age int
}

func compare() (bool, bool) {
    MyFavorite  := struct{  // 匿名結構(有初始值)
        name string
        age int
    }{
        "奇犽",  // 省略欄位名稱
        12,
    }

    sisFavorite := struct {  // 匿名結構(沒有初始值)
        name string
        age int
    }{}
    sisFavorite.name = "庫拉皮卡"  // 透過結構.欄位賦值
    sisFavorite.age = 17

    broFavorite := myFavorites{"奇犽",12}  // 具名結構直接賦值

    return MyFavorite == sisFavorite, MyFavorite == broFavorite // 將欄位相同的匿名結構型別與具名結構型別,兩兩相比較
}

func main() {
    sis, bro := compare()
    fmt.Println("MyFavorite == sisFavorite", sis)
    fmt.Println("MyFavorite == broFavorite", bro)
}

範例 3(執行結果):

MyFavorite == sisFavorite false
MyFavorite == broFavorite true

雖然匿名結構變數只能建立一次,但是實際與具名結構的使用還是大同小異,且無論是具名或是不具名的結構,都是可以兩兩相互比較的。

今天先介紹匿名結構與如何比較結構,那明天要來講 Go 語言,類似物件導向程式設計語言,和 class 一樣可以繼承的替代方案 內嵌(embedding)結構 ,那我們明天見!


上一篇
DAY 18 Go 語言 自訂型別 (custom types) 及結構 (struct) 的定義
下一篇
DAY 20 Go 語言 內嵌結構 (embedding struct)
系列文
跟著 Go 實戰聖經 一起自學 Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言