我有一个函数,它在某些情况下返回一个字符串,即当程序在Linux或MacOS中运行时,否则返回值应该为零,以便在代码中省略一些特定于操作系统的判断.

func test() (response string) {
    if runtime.GOOS != "linux" {  
        return nil
    } else {
        /* blablabla*/
    }
}

然而,当我试图编译这段代码时,我得到了一个错误:

test.go:10:3:不能将nil用作返回参数中的类型字符串.

如果我只返回一个空字符串,比如return "",我就无法将这个返回值与代码中的nil进行比较.

因此,问题是如何返回正确的nil字符串值?

推荐答案

如果您不能使用"",则返回一个*string类型的指针;或者-因为这是GO-您可以声明多个返回值,例如:(response string, ok bool).

在没有"有用"字符串可返回时,使用*string:return nil指针.当您这样做时,将其分配给一个局部变量,并返回其地址.

func test() (response *string) {
    if runtime.GOOS != "linux" {
        return nil
    } else {
        ret := "useful"
        return &ret
    }
}

使用多个返回值:当您有一个有用的字符串要返回时,用ok = true返回它,例如:

return "useful", true

否则:

return "", false

它看起来是这样的:

func test() (response string, ok bool) {
    if runtime.GOOS != "linux" {
        return "", false
    } else {
        return "useful", true
    }
}

在调用方,首先判断ok返回值.如果是true,你可以用string.否则,认为它是无用的.

Also see related questions:

How do I represent an Optional String in Go?

获取并返回指向string:How do I do a literal *int64 in Go?的指针的替代方法

Go相关问答推荐

如何使用go从map.dbf map.prj map.shp map.shx中的任何文件中了解层名称

如何处理Firestore的DataTo方法中的嵌套指针?

GoLang Mochi MQTT服务器(带Python Paho MQTT客户端SSL身份验证失败

仅呈现一个模板的GIN Web应用程序

使用GO从RDPMC获得价值

无法使用Segentio;S Kafka-Go连接到融合的Kafka

无法使用exec从管道中读取.Go中的命令

在 go 中,将接收器 struct 从值更改为指针是否向后兼容?

当我使用 CircleCI 构建 Go Image 时,我得到runtime/cgo: pthread_create failed: Operation not allowed

Go - 永远停止带有上下文的循环

Gorm 在自定义字符串类型上返回 scanner 错误

无法使用 gocsv 读取引用字段

Gorm 预加载给出了模糊的列错误

确保 Go 1.20 编译时的严格可比性?

如何仅提取时间作为持续时间

如何根据 Go 中第二次出现的分隔符拆分字符串?

同时调用应该只获取一次数据

从 map 返回空数组而不是空字符串数组

Golang 查询扫描未将查询正确扫描到 struct 中

获取单调时间,同 CLOCK_MONOTONIC