使用字符串定义的类型值作为字符串

Use string defined type value as string

我有一个定义的命名类型

type User string

现在我想使用 User 值作为实际字符串,就像这样

func SayHello(u User) string {
    return "Hello " + user + "!"
}

但是我收到一个错误:

cannot use "Hello " + user + "!" (type User) as type string in return argument

如何使用命名类型作为其基础类型?

在这种情况下,您可以使用 return "Hello " + string(user) + "!"

您可以使用 fmt.Sprintf 而无需对您的参数进行任何额外的转换或对您的字符串部分进行连接:

func SayHello(u User) string {
    return fmt.Sprintf("Hello %s!", u)
}

即使您将类型从 string 更改为 struct,如果您实现方法 func (u *User) String() string,您仍然可以使用 SayHello。然而,这种方法也适用于 goofle.

提供的常规 string 转换

https://play.golang.org/p/XnxeOucPZdE 试试。

来自Golang Spec

A value x is assignable to a variable of type T ("x is assignable to T") if:

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

命名类型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 + "!"
}

继续查看 Go Playground

Go does not have typedefs

Two types are either identical or different.

A defined type is always different from any other type.

User 是定义的类型,因此不同于字符串类型。

由于 User 的底层类型是字符串,您可以简单地 convert from one type to the other:

"Hello " + string(user) + "!"