Golang加载TOML数据库配置报错:int64转string类型转换失败求解决
问题:TOML配置加载引发接口类型转换panic
你的Go代码尝试加载TOML配置初始化数据库连接时,出现以下panic:
panic: interface conversion: interface {} is int64, not string
代码与配置详情
Go初始化代码:
func Init() *sql.DB { config, err := toml.LoadFile("config.toml") if err != nil { log.Fatal("Erro ao carregar variaveis de ambiente") } host := config.Get("postgres.host").(string) port := config.Get("postgres.port").(string) user := config.Get("postgres.user").(string) password := config.Get("postgres.password").(string) dbname := config.Get("postgres.dbname").(string) stringConnection := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s", host, port, user, password, dbname) db, err := sql.Open("postgres", stringConnection) if err != nil { panic(err) } fmt.Println("Sucesso ao realizar conexão com o banco de dados") err = db.Ping() return db }
对应的config.toml:
[postgres] host = "localhost" port = 5432 user = "postgres" password = "ivaneteJC" dbname = "webhook"
错误原因
config.toml中的port是整数类型(5432),但你在代码里用(string)强制转换config.Get("postgres.port")的返回值,而Get方法返回的实际类型是int64,类型不匹配直接触发panic。
解决方案
提供三种可行的解决方式,按需选择:
方式1:修改TOML配置,将port改为字符串
直接把port的值用引号包裹,转为字符串类型:
[postgres] host = "localhost" port = "5432" # 改为字符串 user = "postgres" password = "ivaneteJC" dbname = "webhook"
这样原代码的类型断言就能正常工作,不需要修改Go代码。
方式2:在Go代码中正确转换int64到string
先将port的返回值断言为int64,再转换为字符串:
// 替换原port赋值的代码 portInt := config.Get("postgres.port").(int64) port := strconv.FormatInt(portInt, 10) // 或者用fmt.Sprintf简化 // port := fmt.Sprintf("%d", config.Get("postgres.port").(int64))
注意需要导入strconv包。
方式3:使用结构体映射配置(推荐)
定义对应TOML结构的Go结构体,通过toml.Unmarshal加载配置,避免手动类型断言的风险:
import ( "fmt" "log" "os" "database/sql" _ "github.com/lib/pq" "github.com/BurntSushi/toml" ) type PostgresConfig struct { Host string `toml:"host"` Port int `toml:"port"` User string `toml:"user"` Password string `toml:"password"` DBName string `toml:"dbname"` } type Config struct { Postgres PostgresConfig `toml:"postgres"` } func Init() *sql.DB { var cfg Config data, err := os.ReadFile("config.toml") if err != nil { log.Fatal("Erro ao carregar arquivo de configuração") } err = toml.Unmarshal(data, &cfg) if err != nil { log.Fatal("Erro ao parsear configuração TOML") } stringConnection := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s", cfg.Postgres.Host, cfg.Postgres.Port, cfg.Postgres.User, cfg.Postgres.Password, cfg.Postgres.DBName) db, err := sql.Open("postgres", stringConnection) if err != nil { panic(err) } fmt.Println("Sucesso ao realizar conexão com o banco de dados") if err = db.Ping(); err != nil { panic(err) } return db }
这种方式更规范,类型安全,还能自动处理配置字段的映射,后期维护更方便。
内容的提问来源于stack exchange,提问作者Guilherme Rodrigues
相关产品推荐
相关产品推荐

