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

问题描述 投票:0回答:4

我通过以下方式定义了一个类型

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 类型作为其基础类型?

go typedef
4个回答
3
投票

Go 没有 typedefs

两种类型要么相同,要么不同。

定义的类型始终与任何其他类型不同。

User 是一个已定义的类型,因此与 string 类型不同。

由于 User 的基础类型是字符串,您可以简单地 从一种类型转换为另一种类型:

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

1
投票

来自 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 + "!"
}

检查 去游乐场


1
投票

在这种情况下,您可以使用

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


1
投票

您可以使用

fmt.Sprintf
,无需对参数进行任何额外转换或连接字符串部分:

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

即使您将类型从

string
更改为
struct
,如果您实现方法
SayHello
,您仍然可以使用
func (u *User) String() string
。然而,这种方法也适用于
string
提供的常规
goofle
转换。

尝试一下 https://play.golang.org/p/XnxeOucPZdE

© www.soinside.com 2019 - 2024. All rights reserved.