如何禁用常量的隐式类型转换?

时间:2018-06-12 21:30:24

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

我有以下代码片段:

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)

1 个答案:

答案 0 :(得分:2)

您无法为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