當(dāng)我注意到以下代碼段沒有編譯時,我感到非常驚訝:aTime := time.Time{}if defaultTime := time.Time{} ; aTime != defaultTime {}編譯器返回:輸入 time.Time 不是表達式defaultTime := time.Time 用作值未定義:defaultTime這里的目的是測試aTime變量是否設(shè)置為其默認值。如果我獲得結(jié)構(gòu)的指針(defaultTime := &time.Time{}),它也不會編譯。但是,如果我在 if 構(gòu)造之外初始化 defaultTime,或者使用 new() 內(nèi)置函數(shù)進行初始化,它確實會編譯:aTime := time.Time{}if defaultTime := new(time.Time) ; aTime != *defaultTime {}從我到處讀到的內(nèi)容來看,new(myStruct)它應(yīng)該完全等同于&myStruct{}。當(dāng)我解釋它時,defaultValue := time.Time {}有資格作為SimpleStmt(特別是Assignment),如If 語句規(guī)范中詳述。盡管我盡了最大努力,但我對這種行為沒有任何解釋。如果有人能讓我的頭停止旋轉(zhuǎn),我將不勝感激。
2 回答

青春有我
TA貢獻1784條經(jīng)驗 獲得超8個贊
該{是公認的開始Block,終止的解析SimpleStmt。犯下這一決定之后,編譯器決定,作為一個SimpleStmt,aTime := time.Time是無效的,因為time.Time沒有可分配的值。但是,解析器嘗試對{.
版本 withnew有效,因為它不包含{字符,因此避免以這種方式混淆解析器。
您還可以通過將其括在括號中來使用文字格式,因為塊不能合法地從表達式的中間開始,因此這也適用:
if defaultTime := (time.Time{}); aTime != defaultTime {
// ...
}
gofmt 給出了有用的消息“預(yù)期的布爾表達式,找到了簡單的語句(復(fù)合文字周圍缺少括號?)”,但奇怪的是,go 編譯器本身沒有。
- 2 回答
- 0 關(guān)注
- 176 瀏覽
添加回答
舉報
0/150
提交
取消