GoLang PGX Postgresql

GoLang PGX Postgresql,postgresql,go,select,pgx,Postgresql,Go,Select,Pgx,我希望从lib/pg切换到pgx,但我无法在pgx中使用简单的工作选择。想知道是否有人能指出这段代码的错误。为什么它不起作用 lib/pg没有问题,但是对于pgx,它们肯定缺少一些东西。我修改了pgx示例代码中的测试代码,以测试我的选择 我已经发布了我在代码运行时修改的代码以及错误。我看不出我怎么会有无效的内存地址,因为select返回。也许有人能指出这段代码是怎么回事 package main import ( "context" "fmt"

我希望从lib/pg切换到pgx,但我无法在pgx中使用简单的工作选择。想知道是否有人能指出这段代码的错误。为什么它不起作用

lib/pg没有问题,但是对于pgx,它们肯定缺少一些东西。我修改了pgx示例代码中的测试代码,以测试我的选择

我已经发布了我在代码运行时修改的代码以及错误。我看不出我怎么会有无效的内存地址,因为select返回。也许有人能指出这段代码是怎么回事

package main

import (
        "context"
        "fmt"
        "os"

        "github.com/jackc/pgx"
)

var conn *pgx.Conn
var err error

func main() {
        conn, err = pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))

        if err != nil {
                fmt.Fprintf(os.Stderr, "Unable to connection to database: %v\n", err)
                os.Exit(1)
        }
        listTasks()
        defer conn.Close(context.Background())
}

func listTasks() error {
        rows, _ := conn.Query(context.Background(), "select * from signal")

        for rows.Next() {
                var s string
                var id int32
                var v float64
                var description string
                var description2 string
                err := rows.Scan(&s, &id, &v, &description, &description2)
                if err != nil {
                        return err
                }
                fmt.Printf("%d. %s\n", id, description)
        }

        return rows.Err()
}
这就是我得到的错误

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x4 pc=0x29eb30]

goroutine 1 [running]:
github.com/jackc/pgx.(*Conn).Query(0x0, 0x38deb8, 0x1414090, 0x3238d7, 0x14, 0x0, 0x0, 0x0, 0x14126c0, 0x192e8, ...)
        /home/forex/go/src/github.com/jackc/pgx/conn.go:585 +0x18
main.listTasks(0x38deb8, 0x1414090)
        /usr/local/forex/test-pgx.go:27 +0x58
main.main()
        /usr/local/forex/test-pgx.go:22 +0xbc

您正在重新定义下面的
conn

conn, err := pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))
因此,您没有分配全局
conn

改为:

var err error
conn, err=px.Connect(...)
根据语言规范:

与常规变量声明不同,短变量声明可以重新声明具有相同类型的同一块(如果块是函数体,则为参数列表)中最初声明的变量,并且至少有一个非空变量是新的


conn
不是在同一个块中定义的,因此短声明是定义
conn
err
,而不是分配给
conn

无效内存地址或零指针解引用
每当我看到这样的错误时,通常意味着我试图给零指针赋值。但在你的情况下,我找不到。
我没有发现这段代码有什么问题,我做了同样的事情,它工作正常。你可以看看。有时os.Getenv不加载.env文件,因此它会导致找不到文件,因此请尝试将数据库源代码复制到pgx,如示例代码所示。

当我将var err error设置为全局时,我只会得到一个不返回的结果。比如select甚至不是执行的。现在,我在错误时得到一个返回值,即无法扫描到dest[3]:无法分配到*字符串,我没有完全获取。不要声明全局错误变量。本地声明。错误是不言自明的:无法将基础列值分配给*字符串。不要选择selec*,而是使用列名称,然后查看您正在处理的列的类型。这似乎不是问题所在,这是我在扫描函数调用中犯的错误。rows.Next():无法扫描到dest[1]:无法将1分配到*字符串中返回的不是postgresql返回的游标的类型转换