为变量指定字符串类型(golang)

17

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

type Username string

我有一个函数返回一个字符串。

我想做的是将用户名设置为该返回字符串:

u := &Username{returnedString}

我也尝试了

var u Username
u = returnedString

但我总是遇到错误。


用户名是一个字符串,不是一个结构体,所以你不能这样做 u :=&Username{returnedString}。你为什么不能用 var u string? - william.taylor.09
你能提供一些关于错误的更详细信息吗? - Jacques Supcik
@william.taylor.09 用户名不是一个字符串,而是在底层类型为字符串的基础上构建的自定义类型。 - Snowman
3个回答

18

正如其他人指出的那样,您需要进行显式类型转换:

someString := funcThatReturnsString()
u := Username(someString)

我建议阅读有关隐式类型转换的本文。具体而言,Honnef参考了Go规范中关于可赋值性的部分:

在以下情况下,值x可以被赋给类型为T的变量(“x可以被赋给T”):

  • x的类型V和T具有相同的基础类型,并且V或T中至少有一个不是命名类型。
因此,在您的示例中,returnedString已经是一个“命名类型”:它的类型为string。如果您改为执行以下操作,则会发生另一种情况:
var u Username
u = "some string"

如果你使用了"some string",它会被隐式转换成Username类型,因为stringUsername都有string作为底层类型,所以你应该没问题。


1
如果我先看到这个答案,我就不会发表我的答案。 - Snowman

12
您已经创建了一个名为“Username”的用户定义类型。如果没有进行转换,就不能将一种类型的值分配给另一种类型(在此情况下是字符串分配给Username)。顺便说一下,您可以将字符串文字分配给它。

您已经创建了一个名为“Username”的用户定义类型。如果没有进行转换,就不能将一种类型的值分配给另一种类型(在此情况下是字符串分配给Username)。顺便说一下,您可以将字符串文字分配给它。

var u Username
u = "test"

会工作。

var u Username
    var s string

    s = "test"
    u = s

会给您一个错误:

无法将类型为字符串的 s 用作分配中的类型 Username

您可以进行转换,因此...:

var u Username
    var s string
    s = "test"
    u = Username(s)

...也会起作用。"u" 的类型将是用户名,其值为"test"。

仅供参考,这些不是用作成语示例。我只是想清楚地说明这里类型的情况。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接