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

时间:2018-04-08 08:59:47

标签: go typedef

我有一个已定义的命名类型

type User string

现在我想使用User值作为实际字符串,如此

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

但我收到错误:

  

不能使用"你好" +用户+"!" (键入User)作为返回参数

中的类型字符串

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

4 个答案:

答案 0 :(得分:2)

Go does not have typedefs

  

两种类型相同或不同。

     

定义的类型总是与任何其他类型不同。

用户是已定义的类型,因此与类型字符串不同。

由于User的基础类型是字符串,因此您只需convert from one type to the other

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

来自Golang Spec

  

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

检查 Go Playground

答案 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转换。

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