猿问

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

在 Golang 中,http.NewRequest有这样的规范:

func NewRequest(method, urlStr string, body io.Reader) (*Request, error)

但是,如果我不想将 传递给对象,我可以将其nil作为body选项传递,如下所示:bodyio.Reader

req, err := http.NewRequest("GET", "http://www.blahblah.org", nil)

我如何在我的代码中实现这个功能?我有一个函数,我想传递一个可选的字符串值,以便它可以翻阅 API 结果,但是如果我将 a 传递nil给字符串输入,我会得到这个:

./snippets.go:32: 无法将 nil 转换为字符串类型

我的函数的参数如下所示:

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


LEATH
浏览 243回答 3
3回答

HUH函数

Go 没有“可选”参数作为其他语言中普遍理解的概念;nil只是接口的零值(io.Reader在这种情况下)。字符串的等效零值是一个空字符串:getChallenges("")如果要接受 0 个或多个相同的参数类型,请使用可变参数语法:func getChallenges(after ...string) ([]challenge, string, error)

qq_笑_17

您可以修改函数以接收指针值,如下所示: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 */)}

红颜莎娜

您可以使用椭圆运算符来发送可选参数.. 不要在可选参数中传递任何内容并检查参数的长度。它应该可以解决您的问题func foo(params ...int) {   fmt.Println(len(params))}func main() {    foo()    foo(1)    foo(1,2,3)}
随时随地看视频慕课网APP

相关分类

Go
我要回答