2 回答
TA贡献1772条经验 获得超8个赞
正如其他人指出的那样,您需要进行显式类型转换:
someString := funcThatReturnsString()
u := Username(someString)
我建议阅读这篇关于隐式类型转换的文章。具体来说,Honnef 参考了 Go 对可分配性的规范:
在以下任一情况下,值 x 可分配给 T 类型的变量(“x 可分配给 T”):
x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中至少有一个不是命名类型。
所以在你的例子中,returnedString已经是一个“命名类型”:它有类型string.如果你做了类似的事情
var u Username
u = "some string"
你就OK了,因为"some string"会被隐式转换成类型Username两者string并Username具有潜在的类型string。
TA贡献1852条经验 获得超7个赞
您已经创建了一个用户定义的类型“用户名”。您不能在不进行转换的情况下将一种类型的值分配给另一种类型(在本例中为用户名的字符串)。顺便说一句,您可以为它分配一个字符串文字。
var u Username
u = "test"
将工作。
var u Username
var s string
s = "test"
u = s
会给你错误:
不能在赋值中使用 s(类型字符串)作为用户名类型
您可以从一种类型转换为另一种类型,因此...:
var u Username
var s string
s = "test"
u = Username(s)
......也会起作用。“u”将是用户名类型,值为“test”。
为了记录,这些并不是惯用的例子。我只是想清楚地说明这里的类型发生了什么。
- 2 回答
- 0 关注
- 165 浏览
添加回答
举报