为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 将 nil 作为可选参数传递给函数?

Golang 将 nil 作为可选参数传递给函数?

Go
LEATH 2021-11-08 15:42:44
在 Golang 中,http.NewRequest有这样的规范:func NewRequest(method, urlStr string, body io.Reader) (*Request, error)但是,如果我不想将 传递给对象,我可以将其nil作为body选项传递,如下所示:bodyio.Readerreq, err := http.NewRequest("GET", "http://www.blahblah.org", nil)我如何在我的代码中实现这个功能?我有一个函数,我想传递一个可选的字符串值,以便它可以翻阅 API 结果,但是如果我将 a 传递nil给字符串输入,我会得到这个:./snippets.go:32: 无法将 nil 转换为字符串类型我的函数的参数如下所示:func getChallenges(after string) ([]challenge, string, error)
查看完整描述

3 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

Go 没有“可选”参数作为其他语言中普遍理解的概念;nil只是接口的零值(io.Reader在这种情况下)。

字符串的等效零值是一个空字符串:

getChallenges("")

如果要接受 0 个或多个相同的参数类型,请使用可变参数语法:

func getChallenges(after ...string) ([]challenge, string, error)


查看完整回答
反对 回复 2021-11-08
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您可以修改函数以接收指针值,如下所示:


func getChallenges(after *string) ([]challenge, string, error)


然后您可以将其nil作为参数传递给它。但是不要忘了检查after的nil取消引用它之前你的函数的内在价值,或者你会得到一个零指针异常:


func getChallenges(after *string) ([]challenge, string, error) {

    if after == nil {

        // No value specified

    } else {

        fmt.Printf("After: %s\n", *after) // Note pointer dereferencing with "*"

    }

    // ...

}

另外一个选项:


只需使用两个函数:


func getChallenges(after string) {}


func getAllChallenges() {

    return getChallenges(/* some default value here */)

}


查看完整回答
反对 回复 2021-11-08
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您可以使用椭圆运算符来发送可选参数.. 不要在可选参数中传递任何内容并检查参数的长度。它应该可以解决您的问题


func foo(params ...int) {

   fmt.Println(len(params))

}


func main() {

    foo()

    foo(1)

    foo(1,2,3)

}


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信