【问题标题】:How to disable implicit type conversion for Constants? [duplicate]如何禁用常量的隐式类型转换? [复制]
【发布时间】:2018-11-22 09:05:18
【问题描述】:

我有以下代码片段:

type ErrorCode string

const (
    INVALID_REQUEST ErrorCode = "INVALID_REQUEST"
)

type Response struct {
    ErrorCode string `json:"errorCode"`
}

func BuildResponseError(errorCode ErrorCode) string {
    user := &Response{ErrorCode: string(errorCode)}
    response, err := json.Marshal(user)
    if err != nil {
        log.Println(err)
        return `{"errorCode":"bad_request"}`
    }

    return string(response)
}

我可以像这样调用函数BuildResponseError

BuildResponseError("wrong_request")

有没有办法禁用这种隐式类型转换?我只想这样调用这个函数,使用枚举值:

BuildResponseError(INVALID_REQUEST)

【问题讨论】:

    标签: go enums type-conversion constants implicit-conversion


    【解决方案1】:

    您不能禁用将string 分配给ErrorCode 类型的变量的可能性,因为ErrorCode 的基础类型是string 并且根据Go 的可分配性规则:

    如果以下条件之一适用,则值 x 可分配给 T 类型的变量(“x 可分配给 T”):

    ...

    • x 的类型 V 和 T 具有相同的底层类型,并且 V 或 T 中的至少一个不是已定义类型

    来源:https://golang.org/ref/spec#Assignability

    因此该功能已内置到语言中。

    实现类似功能的一种方法(不完全相同,但您可以获得最接近的功能)是定义如下类型:

    type ErrorCode struct {
        Code string
    }
    

    然后是一个变量(您不能定义该类型的常量):

    var (
        INVALID_REQUEST ErrorCode = ErrorCode{"INVALID_REQUEST"}
    )
    

    然后你应该修改你的代码,当然,从该类型内部获取Code 来构建响应:

    user := &Response{ErrorCode: errorCode.Code}
    

    这样就不能使用string 调用函数,只接受ErrorCode 值。

    游乐场:https://play.golang.org/p/qoKrGiJQtxv

    【讨论】:

    • 感谢您提供如此好的示例和解释。
    • 正在研究这个确切的解决方案,但最终在结构中嵌入了一个匿名 string 而不是命名字段,这最终做了一些时髦的事情。直到。
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2017-07-20
    • 2013-07-09
    • 1970-01-01
    • 2020-12-24
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多