我通过以下方式定义了一个类型
type User string
现在我想使用
User
值作为实际字符串,如下所示
func SayHello(u User) string {
return "Hello " + user + "!"
}
但是我收到一条错误消息
cannot use "Hello " + user + "!" (type User) as type string in return argument
如何使用 typedef 类型作为其基础类型?
两种类型要么相同,要么不同。
定义的类型始终与任何其他类型不同。
User 是一个已定义的类型,因此与 string 类型不同。
由于 User 的基础类型是字符串,您可以简单地 从一种类型转换为另一种类型:
"Hello " + string(user) + "!"
来自 Golang 规范
值 x 可分配给 T 类型的变量(“x 可分配给 T”)如果:
- 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 + "!"
}
检查 去游乐场
在这种情况下,您可以使用
return "Hello " + string(user) + "!"
fmt.Sprintf
,无需对参数进行任何额外转换或连接字符串部分:
func SayHello(u User) string {
return fmt.Sprintf("Hello %s!", u)
}
即使您将类型从
string
更改为 struct
,如果您实现方法 SayHello
,您仍然可以使用 func (u *User) String() string
。然而,这种方法也适用于 string
提供的常规 goofle
转换。