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
中的语言规范定义:
预先声明的字符串类型是字符串;它是一个定义的类型。
所以分配text
给string
不满足可分配性的条件,它会产生编译器错误。

TA贡献1836条经验 获得超13个赞
您正在寻找的是在可分配性下:
https://go.dev/ref/spec#Assignability
尤其是:
x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中的至少一个不是定义的类型。
在这两种情况下,基础类型都是相等的([]byte
是必需的,text
在情况 1 中传递,string
是必需的,text
在情况 2 中传递),但[]byte
不是定义的类型string
,所以它适用于第一种情况,但不适用于第二种情况.

TA贡献1828条经验 获得超3个赞
- 3 回答
- 0 关注
- 130 浏览
添加回答
举报