gpt4 book ai didi

go - 返回错误的参数太多

转载 作者:IT王子 更新时间:2023-10-29 02:29:23 27 4
gpt4 key购买 nike

我一直在想为什么这段代码会抛出错误:

package util

import (
"path/filepath"
"sync"

"github.com/go-ini/ini"
)

// ConfigMap is map for config values
type ConfigMap struct {
LogPath string
PublicDir string
SessionName string
Debug bool
DBUsersHost string
DBUsersName string
DBUsersUsername string
DBUsersPassword string
}

var once sync.Once

// Config loads and return config object
func Config() (*ConfigMap, error) {
once.Do(func() {
// Find the location of the app.conf file
configFilePath, err := filepath.Abs("../build/app.conf")
if err != nil {
return nil, err
}

// Load app.conf
cfg, err := ini.Load(configFilePath)
if err != nil {
return nil, err
}

// Get app mode
mode, err := AppMode()
if err != nil {
return nil, err
}

c := &ConfigMap{}
err = cfg.Section(mode).MapTo(c)
if err != nil {
return nil, err
}

return c, err
})
}

如您所见,配对完全正确。每个返回码返回 &ConfigMaperr 并且函数签名匹配它。我错过了什么?

最佳答案

您将匿名函数值传递给 once.Do()(即 Once.Do() ),return 语句就在其中。这意味着那些 return 语句想要从匿名函数返回,但它没有任何返回值:

func Config() (*ConfigMap, error) {
once.Do(func() {
// You can't return any values here, only this works:
return
})

// And you do need to return something here:
return &ConfigMap{}, nil
}

您可以做的是创建与 Config() 的返回值相匹配的全局变量,匿名函数应将值存储在其中。在 Config() 中,您可以返回这些全局变量的值。

var cm *ConfigMap
var cmErr error

func Config() (*ConfigMap, error) {
once.Do(func() {
// load config, and store, e.g.
cm, cmErr = &ConfigMap{}, nil
})

return cm, cmErr
}

我们真的需要全局变量吗?由于 Config() 返回的值是由传递给 once.Do() 的匿名函数生成的,它保证只运行一次,是的,您需要存储它们某个地方能够多次返回它们,即使匿名函数不再被调用/运行(在随后调用 Config() 时)。

问题:这里可能存在数据竞争吗?

如果Config()被多个goroutines调用,至少有一个会写入全局变量cmcmErr,所有goroutine都会读取他们。所以问这个问题是对的。

但答案是否定的,上面的代码是安全的。全局变量 cmcmErr 只被写入一次,并且这发生在它们可以被读取之前。因为 once.Do() 阻塞直到匿名函数返回。如果 Config()(因此 once.Do())被多个 goroutine 同时调用,所有 goroutine 都会阻塞,直到匿名函数完成(仅一次),并读取变量只能在第一次写入之后发生。由于匿名函数将不再运行,因此不会再发生写入。

关于go - 返回错误的参数太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42069615/

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