3 回答

TA貢獻1735條經(jīng)驗 獲得超5個贊
您需要將語言規(guī)范中的幾個定義拼湊在一起,以了解發(fā)生了什么:
首先是可分配性:
x 的類型 V 和 T 具有相同的基礎(chǔ)類型,并且 V 或 T 中的至少一個不是定義的類型。
然后你需要檢查你的 V 和 T。
在您的第一個代碼片段中,您有type text []byte
(V)和一個AppendQuote
所需參數(shù)是[]byte
(T)的函數(shù)。
V 和 T 是否具有相同的基礎(chǔ)類型?是的。text
的基礎(chǔ)類型[]byte
由您定義,并且[]byte
是復合類型,其基礎(chǔ)類型是它本身。從類型:
每個類型 T 都有一個基礎(chǔ)類型:如果 T 是預先聲明的布爾、數(shù)字或字符串類型之一,或者是類型文字,則相應的基礎(chǔ)類型是 T 本身
以及上面的段落:
復合類型——[...] slice,[...]——可以使用類型文字來構(gòu)造。
而且,V 或 T 中的至少一個不是定義的類型嗎?是的,[]byte
如上所述是復合類型。
因此,類型的變量text
可分配給[]byte
,包括將參數(shù)傳遞給函數(shù)。
在您的第二個代碼片段中,您有type text string
(V)和一個Quote
所需參數(shù)是string
(T)的函數(shù)。
V 和 T 是否具有相同的基礎(chǔ)類型?是的。一個根據(jù)定義,另一個是預先聲明的類型string
(與上面的引用相同)。
最后,是否至少有一個 V 或 T不是定義的類型?不!兩者都是定義類型。text
由您定義,并由字符串類型string
中的語言規(guī)范定義:
預先聲明的字符串類型是字符串;它是一個定義的類型。
所以分配text
給string
不滿足可分配性的條件,它會產(chǎn)生編譯器錯誤。

TA貢獻1836條經(jīng)驗 獲得超13個贊
您正在尋找的是在可分配性下:
https://go.dev/ref/spec#Assignability
尤其是:
x 的類型 V 和 T 具有相同的基礎(chǔ)類型,并且 V 或 T 中的至少一個不是定義的類型。
在這兩種情況下,基礎(chǔ)類型都是相等的([]byte
是必需的,text
在情況 1 中傳遞,string
是必需的,text
在情況 2 中傳遞),但[]byte
不是定義的類型string
,所以它適用于第一種情況,但不適用于第二種情況.

TA貢獻1828條經(jīng)驗 獲得超3個贊
AppendQuote
接受[]byte
作為參數(shù),并且您hello
被定義為text
類型,這是[]byte
您的類型定義中的一個,這就是它起作用的原因。
func strconv.AppendQuote(dst []byte, s string) []byte
見源代碼
而 Quote 接受字符串作為參數(shù),
func strconv.Quote(s string) string
見源代碼
你的 hello 類型是[]byte
,而不是字符串。這就是為什么它不起作用。您要么必須使用第一種情況,要么將您的 hello 更改為字符串。例如_ = strconv.Quote("hello")
,為了讓它工作。
- 3 回答
- 0 關(guān)注
- 150 瀏覽
添加回答
舉報