分配字符串类型golang

Rod*_*igo 6 types go

我很难将字符串分配给类型字符串.所以我有这种类型:

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两者stringUsername具有潜在的类型string.


Sno*_*man 6

您已将用户定义的类型设为“用户名”。您不能在不进行转换的情况下将一种类型的值分配给另一种类型(在这种情况下,将字符串分配给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”。

出于记录目的,这些不作为惯用示例。我只是想清楚地说明这里的类型是怎么回事。