【问题标题】:assign a string type golang分配一个字符串类型golang
【发布时间】:2016-05-15 19:49:39
【问题描述】:

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

type Username string

然后我有一个返回字符串的函数

我正在尝试将用户名设置为返回的字符串:

u := &Username{returnedString}

我也试过

var u Username
u = returnedString

但我总是得到一个错误。

【问题讨论】:

  • 用户名是一个字符串,而不是一个结构,所以你不能这样做 :=&Username{returnedString}。你不能做 var u string 有什么原因吗?
  • 你能提供更多关于错误的细节吗?
  • @william.taylor.09 用户名不是字符串,而是基于底层类型字符串的自定义类型。

标签: go types


【解决方案1】:

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

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

我建议阅读 this article 关于隐式类型转换。具体来说,Honnef 在 assignability 上引用了 Go 的规范:

在以下任何一种情况下,值 x 都可分配给 T 类型的变量(“x 可分配给 T”):

  • x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中的至少一个不是命名类型。

所以在你的例子中,returnedString 已经是一个“命名类型”:它有类型 string. 如果你做了类似的事情

var u Username
u = "some string"

你会没事的,因为"some string" 将被隐式转换为Username 类型,stringUsername 都具有string 的基础类型。

【讨论】:

  • 如果我第一次看到这个,我就不会发布我的答案了。
【解决方案2】:

您已经创建了一个用户定义类型“用户名”。您不能将一种类型的值分配给另一种类型(在本例中为用户名的字符串)而不进行转换。顺便说一句,您可以为其分配一个字符串文字。

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”。

为了记录,这些并不是惯用的例子。我只是想清楚地说明这里的类型发生了什么。

【讨论】:

    【解决方案3】:

    解释了 go 中的类型转换in the tutorial "A Tour of Go"

    使用您的类型查看here for an example

    【讨论】:

      猜你喜欢
      • 2019-09-18
      • 2019-09-06
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多