我有一個元素陣列/切片(在我的示例中為位元組),我想使用ftm.Println. 我當然可以回圈遍歷陣列中的元素并以這種方式列印它們,但我認為如果我只是使用...運算子傳遞元素會更好/更短。
所以我嘗試了這個:
b := []byte{1,2,3,4}
fmt.Println(b...)
這會導致錯誤:
不能在 fmt.Println 的引數中使用 b([]byte 型別的變數)作為 []any 型別”
有人可以解釋為什么這不起作用嗎?
我假設這fmt.Println是一個可變引數函式,它能夠處理任意數量的任何型別的元素([]any錯誤訊息中的似乎表明是這種情況)。Println因此,當我傳遞 4 個位元組時似乎無法處理它,這讓我有點驚訝。
事實上,當我們像這樣傳遞這些相同的位元組時,它作業得很好:
fmt.Println(b[0], b[1], b[2], b[3])
那么為什么它在使用時不起作用b...呢?這本質上不是一回事嗎(即在這兩種情況下,我們所做的都是將 4 個位元組作為單獨的引數傳遞給fmt.Println?
uj5u.com熱心網友回復:
可變引數作為切片傳遞。在下面的:
fmt.Println(b[0], b[1], b[2], b[3])
編譯器從四個元素創建一個切片[]any,并傳遞該切片。
然而,
b := []byte{1,2,3,4}
fmt.Println(b...)
嘗試傳遞[]byte與函式簽名不兼容的 a 。
這雖然有效:
b := []any{1,2,3,4}
fmt.Println(b...)
[]byte不能被替換,[]any因為位元組陣列在結構上與介面陣列不同。因此,逐個元素的轉換是必要的,這可能是昂貴的。一般來說,Go 語言不執行可能很昂貴的隱式轉換。如果你需要這樣做,那么你必須自己明確地做到這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/453012.html
