Database 如何解决go编程语言中的数据库结构问题?

Database 如何解决go编程语言中的数据库结构问题?,database,postgresql,go,struct,Database,Postgresql,Go,Struct,我正在尝试创建postgresql数据库结构,以自动化Golang中的系统 该代码正在运行 package main import ( "database/sql" "fmt" _ "github.com/lib/pq" ) func checkError(err error){ if err!=nil{ panic(err) } } const ( host = "localhost" port =

我正在尝试创建postgresql数据库结构,以自动化Golang中的系统

该代码正在运行

package main

import (
    "database/sql"
    "fmt"

    _ "github.com/lib/pq"
)

func checkError(err error){
    if err!=nil{
        panic(err)
    }
}

const (
    host     = "localhost"
    port     = 5432
    user     = "postgres"
    password = "123"
    dbname   = "DatabaseName"
)

func main() {
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
        "password=%s dbname=%s sslmode=disable",
        host, port, user, password, dbname)
    db, err := sql.Open("postgres", psqlInfo)
    checkError(err)

    err = db.Ping()
    checkError(err)

    defer db.Close()
    fmt.Println("Successfully connected!")
}
结果:成功连接

但是当我试图创建一个结构时,系统给了我一个错误

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
)

func checkError(err error){
    if err!=nil{
        panic(err)
    }
}

type Database struct{
    host, port, user, password, dbname string
    db *sql.DB
}

func(d *Database) Open(){
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+"password=%s dbname=%s sslmode=disable", d.host, d.port, d.user, d.password, d.dbname)
    db, err := sql.Open("postgres", psqlInfo)
    checkError(err)
    d.db = db
}

func(d *Database) IsOpened() {
    checkError(d.db.Ping())
}

func main() {
    a := Database{host: "localhost", port: "5432", user: "postgres", password: "123", dbname: "DatabaseName"}
    a.Open()
    a.IsOpened()
}
结果:死机:拨号tcp:lookup tcp/%!d(字符串=5432):getaddrinfow: 找不到指定的类

goroutine1[正在运行]:main.checkError(…)/main.go:11

main.(*数据库).IsOpened(…)/main.go:28 main.main()/main.go:34 +0xcc


发生这种情况是因为您使用了数据类型的mashup。您已将端口号声明为字符串,但在构建连接字符串时,您已将端口号指定为整数,这将生成
host=localhost port=%!d(string=5432)user=postgres password=123 dbname=DatabaseName sslmode=disable
错误的连接字符串。您的连接字符串应该是
host=localhost port=5432 user=postgres password=123 dbname=DatabaseName sslmode=disable
。您可以在
struct
中将端口号数据类型从
string
更改为
int

type Database struct {
    host, user, password, dbname string
    port                         int
    db                           *sql.DB
}

或者,在构建连接字符串时,可以将端口号类型从
%d
更改为
%s

psqlInfo := fmt.Sprintf("host=%s port=%s user=%s "+"password=%s dbname=%s sslmode=disable", d.host, d.port, d.user, d.password, d.dbname)

端口
是一个字符串,您正试图使用
%d
对其进行格式化。已保存我的一天!谢谢