昨天了解了自訂型別以及結構的定義,今天就來了解結構中還有哪些其他種用法!
結構型別正常來說會在套件的層級就宣告,因為這樣後面各個函式都可以取用,當然你也可以將結構宣告在函式內,只是這樣這個結構就會有 scope 的問題,他只有在函式內才有效。
而定義在函式內的結構型別我們稱為 匿名結構(anonymous strut) ,他有以下三個特點:
<結構變數名稱> := 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)結構 ,那我們明天見!