gpt4 book ai didi

go - 强制函数只接受类型,而不是类型的底层类型

转载 作者:行者123 更新时间:2023-12-01 22:31:51 25 4
gpt4 key购买 nike

如何确保函数只接受定义的类型而不接受该类型的基础类型?

我将我的伪枚举定义如下:

type Method string

var Methods = struct {
GET Method
POST Method
PATCH Method
}{
GET: "GET",
POST: "POST",
PATCH: "PATCH",
}

并以下列方式使用它们(简化):

func getRequest(method Method) (*http.Request, error) {
return http.NewRequest(string(method), "some_random_path", nil)
}

func main() {
_, _ = getRequest(Methods.GET) // This is the intended use
_, _ = getRequest("GET") // Why is this allowed?
}

为什么编译器不提示使用 "GET"字符串文字,其中 Method类型是必需的?
如何更改我的代码,以便在需要类型 Method 的地方不能使用字符串文字?

最佳答案

"GET"是一个无类型常量。如果可以将无类型常量转换为基础类型,则将其转换为该类型。在示例中:

 _, _ = getRequest("GET")

在这里, "GET"Method 类型,而不是 string .不允许出现以下情况:
s:="GET"
getRequest(s)

因为在这里, sstring ,而不是 Method .

如果你需要绝对的类枚举类型安全,你可以尝试这样的事情:
type Method struct{v string}

var Methods = struct {
GET Method
POST Method
PATCH Method
}{
GET: Method{v:"GET"},
POST: Method{v:"POST"},
PATCH: Method{v:"PATCH"},
}

然而,这是丑陋的,通常不值得努力。

关于go - 强制函数只接受类型,而不是类型的底层类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com