Golang中第二次调用时为什么会出现问题?

Golang中第二次调用时为什么会出现问题? 我对 config.GetConfig() 进行了两次调用,而集成开发环境在第二次调用时显示错误

func main() {
	config := config.GetConfig()
	fmt.Println(config.Port)
	config.Port = 999
	fmt.Println(config.Port) // 999

	config1 := config.GetConfig() // config.GetConfig undefined (type config.Config has no field or method GetConfig)
	...

在配置包中

var cfg Config
func init(){
	...
	cfg = Config{
		Host:        _host,
		...
	}
}

func GetConfig() Config {
	return cfg
}

这里的问题是什么?


更多关于Golang中第二次调用时为什么会出现问题?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

抱歉,我找到了问题所在 - 是包名和局部变量使用了相同的名称

更多关于Golang中第二次调用时为什么会出现问题?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题在于你混淆了变量名和包名。在 main 函数中,你首先将 config.GetConfig() 的返回值赋给了变量 config,该变量类型为 config.Config。然后你试图在变量 config 上调用 GetConfig() 方法,但 config.Config 类型并没有 GetConfig 方法。GetConfigconfig 包中的函数,而不是 Config 结构体的方法。

以下是修正后的代码示例:

func main() {
    // 第一次调用 config 包中的 GetConfig 函数
    cfg := config.GetConfig()
    fmt.Println(cfg.Port)
    cfg.Port = 999
    fmt.Println(cfg.Port) // 999

    // 第二次调用 config 包中的 GetConfig 函数
    cfg1 := config.GetConfig() // 使用包名调用,而不是变量
    fmt.Println(cfg1.Port) // 输出原始端口值,因为 cfg1 是新的实例
}

在配置包中,代码保持不变:

package config

type Config struct {
    Host string
    Port int
    // 其他字段...
}

var cfg Config

func init() {
    // 初始化配置
    cfg = Config{
        Host: "localhost",
        Port: 8080,
    }
}

func GetConfig() Config {
    return cfg
}

关键点:

  • main 函数中,使用 config.GetConfig() 调用包函数,而不是在变量上调用。
  • 变量名 config 与包名 config 冲突,建议使用 cfg 或其他名称避免混淆。
  • 每次调用 GetConfig() 返回的是全局变量 cfg 的副本,修改副本不会影响全局配置。如果需要单例行为,应使用指针或同步机制。
回到顶部