2 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超6個贊
這部分:
if tm, err := time.Parse(...)
創(chuàng)建一個僅在語句內(nèi)具有范圍的新變量- 它不是您聲明為的變量。tm
if
var tm time.Time
此新變量未在 中使用if
,因此會出現(xiàn)錯誤。請注意,您也沒有tm
分配外部級別,因此fmt.Println
將打印零時間,而不是 time.Parse 返回的時間。
要解決此問題:聲明err
并更改if
為:
var err errorif tm, err = time.Parse(...)
注意這是 GO 中的一個微妙的事情,也是一個相當(dāng)常見的錯誤來源。該:=
語句實際上可以與已經(jīng)聲明的變量和一個或多個新變量的混合使用 - 如果已經(jīng)聲明的變量在相同的詞法范圍內(nèi)。然后,只有新的由自動聲明:=
,其余的只是分配(與=
)。但是,如果您在新范圍內(nèi)使用:=
,則所有變量都在該范圍內(nèi)聲明,并屏蔽任何具有相同名稱的外部范圍變量(例如在 ;if
注意條件if
不在大括號內(nèi),但仍被視為如果它在塊內(nèi); GO 中的{code}
the 和其他復(fù)合語句也會發(fā)生同樣的情況)。for

TA貢獻(xiàn)1752條經(jīng)驗 獲得超4個贊
您的if
語句聲明了一個新變量tm
,該變量僅存在于if
塊的范圍內(nèi)并且確實從未使用過:
if?tm,?err?:=?time.Parse(time.RFC3339,?"2018-09-11T17:50:54.247Z");?err?!=?nil?{ ????panic(err) }
在 Go 中,:=
聲明一個新變量并對其進(jìn)行初始化。你的意思可能是:
func main() {
? ? var val reflect.Value
? ? var tm time.Time
? ? var err error
? ? // Note the change to normal assignment here instead of :=
? ? if tm, err = time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil {
? ? ? ? panic(err)
? ? }
? ? val = reflect.ValueOf(tm)
? ? fmt.Println(val, tm, reflect.TypeOf(tm))
}
shortcut運算符在Go Tour of Go:=
中進(jìn)行了演示,并在Go spec中進(jìn)行了解釋,后者包括:
它是帶有初始化表達(dá)式但沒有類型的常規(guī)變量聲明的簡寫:
"var" IdentifierList = ExpressionList .
Go 規(guī)范中也解釋了作用域。
- 2 回答
- 0 關(guān)注
- 201 瀏覽
添加回答
舉報