我有一个已定义的命名类型
type User string
现在我想使用User
值作为实际字符串,如此
func SayHello(u User) string {
return "Hello " + user + "!"
}
但我收到错误:
不能使用"你好" +用户+"!" (键入User)作为返回参数
中的类型字符串
如何使用命名类型作为其基础类型?
答案 0 :(得分:2)
两种类型相同或不同。
定义的类型总是与任何其他类型不同。
用户是已定义的类型,因此与类型字符串不同。
由于User的基础类型是字符串,因此您只需convert from one type to the other:
"Hello " + string(user) + "!"
答案 1 :(得分:1)
在这种情况下,您可以使用return "Hello " + string(user) + "!"
答案 2 :(得分:1)
值x可分配给类型为T的变量(" x可分配给 T")if:
- x的类型与T相同。
- x的类型V和T具有相同的基础类型,并且V或T中的至少一个不是定义的类型。
命名类型type User string
和未命名类型var user string
的变量完全不同。
我们可以检查使用反射来显示基础类型。
package main
import (
"fmt"
"reflect"
)
type User string
func main() {
var name User = "User"
var name2 string = "User"
//fmt.Print(name==name2) // mismatched types User and string
fmt.Println(reflect.TypeOf(name2))
fmt.Println(reflect.TypeOf(name))
}
因此,检查变量的基础类型,然后键入将类型转换为原始类型以比较值。
package main
import (
"fmt"
)
type User string
func main() {
var u User
fmt.Print(SayHello(u))
}
func SayHello(u User) string {
change := string(u)
return "Hello " + change + "!"
}
答案 3 :(得分:0)
你可以使用fmt.Sprintf
而无需对你的论点进行任何额外的转换或串联你的部分字符串:
func SayHello(u User) string {
return fmt.Sprintf("Hello %s!", u)
}
即使您将类型从string
更改为struct
,如果您要实施方法SayHello
,仍然可以使用func (u *User) String() string
。但是,此类方法也适用于string
提供的常规goofle
转换。