亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的類型別名與類型定義

Go 中的類型別名與類型定義

Go
泛舟湖上清波郎朗 2023-06-05 09:12:30
我在代碼中偶然發現了這種類型別名:type LightSource = struct {  R, G, B, L float32  X, Y, Z, A float32  //...}我的問題是:使用這樣的類型別名來定義 astruct而不是這樣做的原因是什么?type LightSource struct {  R, G, B, L float32  //...etc}
查看完整描述

3 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

在這種情況下,我假設這是錯誤完成的——第一種選擇“匿名”定義了一個類型,然后為其分配了一個別名,因此兩種情況下的最終結果是相同的,但第二種選擇仍然是唯一正確的選擇。

類型別名僅在少數情況下有用,例如,如此處所寫,它們可用于大規模重構。


查看完整回答
反對 回復 2023-06-05
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

我發現類型別名對可讀性很有用。例如,在測試中,您可能會像這樣比較 JSON 解碼器的輸出:

reflect.DeepEqual(r,?map[string]interface{}{"a":?map[string]interface{}{"b":?42.0}})

但您可以使用類型別名來提高可讀性:

type?JsonObject?=?map[string]interface{}
...
reflect.DeepEqual(r,?JsonObject{"a":?JsonObject{"b":?42.0}})

因為 DeepEqual 使用反射來比較類型(和值),所以使類型別名成為類型定義(通過刪除 = 字符)將導致 DeepEqual 失敗。


查看完整回答
反對 回復 2023-06-05
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

為了補充 Rob64 的回答,他指出最終結果是相同的,但不要誤會您最終會得到兩種不同類型的事實。


type LightSource = struct { // Type struct

  R, G, B, L float32

  X, Y, Z, A float32

  //...

}

type LightSource struct { // Type LightSource

  R, G, B, L float32

  //...etc

}

我覺得你最終會得到不同的類型這一事實有很多困惑,這意味著如果你在代碼中的某個地方強制執行類型 A,并且你使用錯誤的類型別名方式,你將結束對您的“類型別名”絕對零限制;如果您最終創建了類型別名,最終目標實際上是區分您的類型,但如果您犯了這個錯誤,那顯然是無效的。


查看完整回答
反對 回復 2023-06-05
  • 3 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號