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 方法。GetConfig 是 config 包中的函数,而不是 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的副本,修改副本不会影响全局配置。如果需要单例行为,应使用指针或同步机制。

