在 Go 中将自定义类型转换为字符串

Posted

技术标签:

【中文标题】在 Go 中将自定义类型转换为字符串【英文标题】:Converting a custom type to string in Go 【发布时间】:2018-02-04 02:32:48 【问题描述】:

在这个奇怪的例子中,有人创建了一个实际上只是一个字符串的新类型:

type CustomType string

const (
        Foobar CustomType = "somestring"
)

func SomeFunction() string 
        return Foobar

但是,这段代码编译失败:

不能在返回参数中使用 Foobar(自定义类型类型)作为类型字符串

您将如何修复 SomeFunction 以便它能够返回 Foobar ("somestring") 的字符串值?

【问题讨论】:

创建一个只是字符串的类型并不是那么奇怪。例如,如果您知道某个字符串始终是国家/地区名称,您可以创建一个type Country string;这将使代码更易于阅读。 @Akavall 如何将Country 类型限制为已知的值列表?我们能做到吗? 【参考方案1】:

Convert将值转为字符串:

func SomeFunction() string 
        return string(Foobar)

【讨论】:

如果无法控制字符串类型别名,则非常有用;在那些情况下添加String 方法是不可能的。【参考方案2】:

最好为Customtype 定义一个String 函数 - 随着时间的推移,它可以让您的生活更轻松 - 随着结构的发展,您可以更好地控制事物。如果你真的需要SomeFunction,那就让它返回Foobar.String()

   package main

    import (
        "fmt"
    )

    type CustomType string

    const (
        Foobar CustomType = "somestring"
    )

    func main() 
        fmt.Println("Hello, playground", Foobar)
        fmt.Printf("%s", Foobar)
        fmt.Println("\n\n")
        fmt.Println(SomeFunction())
    

    func (c CustomType) String() string 
        fmt.Println("Executing String() for CustomType!")
        return string(c)
    

    func SomeFunction() string 
        return Foobar.String()
    

https://play.golang.org/p/jMKMcQjQj3

【讨论】:

【参考方案3】:

对于每一个类型T,都有一个对应的转换操作T(x) 将值 x 转换为类型 T。从一种类型转换为 如果两者具有相同的基础类型,或者如果两者都具有相同的基础类型,则允许另一个 是指向相同变量的未命名指针类型 基础类型;这些转换会改变类型,但不会改变 值的表示。如果 x 可分配给 T,则转换 是允许的,但通常是多余的。 - 取自The Go Programming Language - by Alan A. A. Donovan

根据您的示例,这里有一些将返回值的不同示例。

package main

import "fmt"

type CustomType string

const (
    Foobar CustomType = "somestring"
)

func SomeFunction() CustomType 
    return Foobar

func SomeOtherFunction() string 
    return string(Foobar)

func SomeOtherFunction2() CustomType 
    return CustomType("somestring") // Here value is a static string.

func main() 
    fmt.Println(SomeFunction())
    fmt.Println(SomeOtherFunction())
    fmt.Println(SomeOtherFunction2())

它会输出:

somestring
somestring
somestring

The Go Playground link

【讨论】:

【参考方案4】:

你可以这样转换:

var i int = 42 var f float64 = float64(i)

检查here

你可以这样返回:

return string(Foobar)

【讨论】:

以上是关于在 Go 中将自定义类型转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swashbuckle.AspNetCore 在 Swagger 模式中将自定义泛型类型公开为字符串

为字符串格式添加自定义转换类型

《Go语言实战》Go 类型:基本类型引用类型结构类型自定义类型

09.AutoMapper 之自定义类型转换器(Custom Type Converters)

如何防止 gorm 将自定义整数类型转换为字符串?

解决DataX自定义kuduWriter无法解析Blob类型字段的问题