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

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

string vs []byte 類型定義

string vs []byte 類型定義

Go
繁星點點滴滴 2022-10-24 15:43:34
如果我有此代碼,它將按預期工作:package mainimport "strconv"type text []bytefunc main() {   hello := text("hello")   _ = strconv.AppendQuote(hello, " world")}但這段代碼失敗了:package mainimport "strconv"type text stringfunc main() {   hello := text("hello")   // cannot use hello (type text) as type string in argument to strconv.Quote   _ = strconv.Quote(hello)}為什么一個通過,另一個失???我檢查了文檔 [1],但沒有看到任何解釋差異的內容。https://go.dev/ref/spec#Type_definitions
查看完整描述

3 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

您需要將語言規范中的幾個定義拼湊在一起,以了解發生了什么:

首先是可分配性:

x 的類型 V 和 T 具有相同的基礎類型,并且 V 或 T 中的至少一個不是定義的類型。

然后你需要檢查你的 V 和 T。

在您的第一個代碼片段中,您有type text []byte(V)和一個AppendQuote所需參數是[]byte(T)的函數。

V 和 T 是否具有相同的基礎類型?是的。text的基礎類型[]byte由您定義,并且[]byte是復合類型,其基礎類型是它本身。從類型

每個類型 T 都有一個基礎類型:如果 T 是預先聲明的布爾、數字或字符串類型之一,或者是類型文字,則相應的基礎類型是 T 本身

以及上面的段落:

復合類型——[...] slice,[...]——可以使用類型文字來構造。

而且,V 或 T 中的至少一個不是定義的類型嗎?是的,[]byte如上所述是復合類型。

因此,類型的變量text可分配給[]byte,包括將參數傳遞給函數。


在您的第二個代碼片段中,您有type text string(V)和一個Quote所需參數是string(T)的函數。

V 和 T 是否具有相同的基礎類型?是的。一個根據定義,另一個是預先聲明的類型string(與上面的引用相同)。

最后,是否至少有一個 V 或 T不是定義的類型?不!兩者都是定義類型。text由您定義,并由字符串類型string中的語言規范定義:

預先聲明的字符串類型是字符串;它是一個定義的類型。

所以分配textstring不滿足可分配性的條件,它會產生編譯器錯誤。


查看完整回答
反對 回復 2022-10-24
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

您正在尋找的是在可分配性下:

https://go.dev/ref/spec#Assignability

尤其是:

x 的類型 V 和 T 具有相同的基礎類型,并且 V 或 T 中的至少一個不是定義的類型。

在這兩種情況下,基礎類型都是相等的([]byte是必需的,text在情況 1 中傳遞,string是必需的,text在情況 2 中傳遞),但[]byte不是定義的類型string,所以它適用于第一種情況,但不適用于第二種情況.


查看完整回答
反對 回復 2022-10-24
?
子衿沉夜

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

AppendQuote接受[]byte作為參數,并且您hello被定義為text類型,這是[]byte您的類型定義中的一個,這就是它起作用的原因。

func strconv.AppendQuote(dst []byte, s string) []byte 見源代碼

而 Quote 接受字符串作為參數,

func strconv.Quote(s string) string 見源代碼

你的 hello 類型是[]byte,而不是字符串。這就是為什么它不起作用。您要么必須使用第一種情況,要么將您的 hello 更改為字符串。例如_ = strconv.Quote("hello"),為了讓它工作。


查看完整回答
反對 回復 2022-10-24
  • 3 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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