我有一种类型的 struct ,需要从另一个函数中更改其值.函数SetPath()使用一个指向我要更改的字符串的指针和另一个指向我要使用的默认值的指针.调用函数时,我可以向它传递 struct 中字符串的地址,但不能传递指针或定义默认值的常量的地址.

package main

const DefaultFileName string = "default.config"

type Settings struct {
    FilePath string
}

func SetPath(path, defaultPath *string) {
    if *path == "" {
        *path = *defaultPath
    }
}

func main() {
    settings := new(Settings)

    SetPath(&settings.FilePath, &DefaultFileName)

}

上面代码中的问题是main()的最后一行-如何将指针传递给常数DefaultFileName,以便在SetPath()中使用其值?我的编辑们抱怨这个常数,但不是&settings.FilePath.

我相信一个解决方案是将函数签名更改为如下内容:

func SetPath(path *string, defaultPath string)

但我真的很想更多地理解指针,我觉得这是一个很好的机会来了解我应该在何时、何地以及如何使用它们,特别是因为优化内存使用在这个项目中很重要.

推荐答案

您不能获取常量的地址,有关详细信息,请参阅Find address of constant in go.

但你不需要.SetPath()只想修改path,但不想修改defaultPath,所以defaultPath不需要是指针,事实上,如果不是,它就更清楚了.

func SetPath(path *string, defaultPath string) {
    if *path == "" {
        *path = defaultPath
    }
}

并称之为:

SetPath(&settings.FilePath, DefaultFileName)

Go相关问答推荐

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

在整个SQL事务中将使用上下文作为默认设置吗?

如何从 nil 指针创建值

在 Go 中将元数据从一个 JPEG 复制到另一个

如何在正则表达式中使整个单词可选?

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

linter 警告:返回值被忽略

Go struct 匿名字段是公开的还是私有的?

在两个单独的速率受限端点之间同步请求

如何使用管理员权限启动 powershell 进程并重定向标准输入 (os.exec)

甚至用天真的洗牌分配?

转换朴素递归硬币问题时的记忆错误

将 .gz 文件添加到 tar.gz 文件,但在添加之前解码 gz.输出文件被剪辑(损坏)

Go 泛型:自引用接口约束

在 Raspberry Pi4 上下载 Go Mod

如何在Go中替换符号并使下一个字母大写

golang jwt.MapClaims 获取用户ID

如何从 docker-compose 命令运行 2 个不同的命令:

Go generics:我会在哪里使用 any 而不是 interface{}?

如何动态解析 Go Fiber 中的请求正文?