正如其他人指出的那样,您需要进行显式类型转换:someString := funcThatReturnsString()u := Username(someString)我建议阅读这篇关于隐式类型转换的文章。具体来说,Honnef 参考了 Go 对可分配性的规范:在以下任一情况下,值 x 可分配给 T 类型的变量(“x 可分配给 T”):x 的类型 V 和 T 具有相同的基础类型,并且 V 或 T 中至少有一个不是命名类型。所以在你的例子中,returnedString已经是一个“命名类型”:它有类型string.如果你做了类似的事情var u Usernameu = "some string"你就OK了,因为"some string"会被隐式转换成类型Username两者string并Username具有潜在的类型string。
您已经创建了一个用户定义的类型“用户名”。您不能在不进行转换的情况下将一种类型的值分配给另一种类型(在本例中为用户名的字符串)。顺便说一句,您可以为它分配一个字符串文字。var u Usernameu = "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”。为了记录,这些并不是惯用的例子。我只是想清楚地说明这里的类型发生了什么。