我很难将字符串分配给类型字符串.所以我有这种类型:
type Username string
Run Code Online (Sandbox Code Playgroud)
然后我有一个返回字符串的函数
我要做的是将用户名设置为返回的字符串:
u := &Username{returnedString}
Run Code Online (Sandbox Code Playgroud)
我也试过了
var u Username
u = returnedString
Run Code Online (Sandbox Code Playgroud)
但我总是得到一个错误.
Ger*_*itS 10
正如其他人指出的那样,您需要进行显式类型转换:
someString := funcThatReturnsString()
u := Username(someString)
Run Code Online (Sandbox Code Playgroud)
我建议阅读关于隐式类型转换的这篇文章.具体而言,Honnef参考了Go关于可转让性的规范:
在任何这些情况下,值x可分配给类型为T的变量("x可赋予T"):
- x的类型V和T具有相同的基础类型,并且V或T中的至少一个不是命名类型.
所以在你的例子中,returnedString它已经是一个"命名类型":它有类型string.如果你做了类似的事情
var u Username
u = "some string"
Run Code Online (Sandbox Code Playgroud)
你就OK了,因为"some string"会被隐式转换成类型Username两者string并Username具有潜在的类型string.
您已将用户定义的类型设为“用户名”。您不能在不进行转换的情况下将一种类型的值分配给另一种类型(在这种情况下,将字符串分配给Username)。附带地,您可以为其分配字符串文字。
var u Username
u = "test"
Run Code Online (Sandbox Code Playgroud)
将工作。
var u Username
var s string
s = "test"
u = s
Run Code Online (Sandbox Code Playgroud)
会给你错误:
不能在分配中使用s(类型字符串)作为用户名类型
您可以从一种类型转换为另一种类型,所以...:
var u Username
var s string
s = "test"
u = Username(s)
Run Code Online (Sandbox Code Playgroud)
...也将起作用。“ u”将是用户名类型,其值为“ test”。
出于记录目的,这些不作为惯用示例。我只是想清楚地说明这里的类型是怎么回事。