2016-02-05 34 views
3

我很难将字符串分配给类型字符串。所以,我有这种类型的:指定字符串类型golang

type Username string 

然后我有一个返回一个字符串

我试图做的是设置的用户名对返回函数的字符串:

u := &Username{returnedString} 

我也试过

var u Username 
u = returnedString 

但我总是得到一个错误。

+0

用户名是一个字符串,而不是一个结构,所以你不能做u:=&Username {returnedString}。有没有理由你不能做var u字符串? –

+0

你能给出关于错误的更多细节吗? –

+0

@ william.taylor.09用户名不是一个字符串,而是一个构建在基础类型字符串上的自定义类型。 – Snowman

回答

4

正如其他人所指出的那样,你需要做一个显式类型转换:

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

我建议你上隐式类型转换读this article。具体来说,Honnef的引用上assignability Go的规格:

A value x is assignable to a variable of type T ("x is assignable to T") in any of these cases:

  • x's type V and T have identical underlying types and at least one of V or T is not a named type.

所以,在你的榜样,在returnedString已经是一个“命名类型”:它具有类型string.如果你已经不是做了什么样

var u Username 
u = "some string" 

你因为"some string"将被隐含地转换为Username类型,并且stringUsername都具有基本类型string

+1

如果我第一次看到这个,我不会发布我的答案。 – Snowman

4

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

var u Username 
u = "test" 

会工作。

var u Username 
    var s string 

    s = "test" 
    u = s 

会给你的错误:

cannot use s (type string) as type Username in assignment

可以从一种类型转换为另一种,所以...:

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

...也可以工作。 “u”将具有值“test”的用户名类型。

为了记录这些不是作为惯用的例子。我只是试图清楚地说明这里的类型是怎么回事。