You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:10:33