我有以下代码片段:
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)
答案 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
个值。