Golang中Sql.NullXXXX导致的编译错误如何解决

Golang中Sql.NullXXXX导致的编译错误如何解决 我正在尝试从一个包含空字段的数据表获取数据。读取后,这些数据将被转换为JSON。 我创建了3个变量来存放表数据:

var (
			item              customerInformationOutput
			state             sql.NullString
			confirmationDelay sql.NullInt64
			linkedTo          sql.NullString
		)

但是Go编译器在使用了sql.NullXXX的行上标记了错误,提示信息如下:

services\getcustomerinformation.go:122:25: sql.NullString undefined (type string has no field or method NullString) services\getcustomerinformation.go:123:25: sql.NullInt64 undefined (type string has no field or method NullInt64) services\getcustomerinformation.go:124:25: sql.NullString undefined (type string has no field or method NullString)

我已经导入了相应的包 "database/sql",并且在另一个源码文件中同样的用法没有问题…

有什么建议需要我检查的吗?

提前感谢。


更多关于Golang中Sql.NullXXXX导致的编译错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

很高兴看到你解决了问题。请将问题标记为已解答。

更多关于Golang中Sql.NullXXXX导致的编译错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,我在回家的路上想通了…… 这明显是我需要休假了!!! 非常感谢!!!

你在同一作用域内声明了一个名为“sql”的字符串变量。这隐藏了sql包。

看起来你在使用 sql.NullStringsql.NullInt64 时遇到了编译错误。错误信息表明 Go 编译器将 sql 识别为了一个字符串类型,而不是 database/sql 包。这通常是由于变量命名冲突导致的。

在你的代码中,很可能已经有一个名为 sql 的变量(可能是字符串类型),它覆盖了导入的 database/sql 包。检查你的代码中是否在其他地方声明了 sql 变量。

以下是一个示例,展示了这种冲突以及如何解决:

问题代码示例:

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
)

func main() {
    // 这里意外地声明了一个名为 sql 的字符串变量
    sql := "some string"

    var (
        state             sql.NullString // 编译错误:sql.NullString undefined
        confirmationDelay sql.NullInt64  // 编译错误:sql.NullInt64 undefined
    )

    // 使用这些变量...
    _ = state
    _ = confirmationDelay

    // 其他代码...
}

解决方案: 重命名冲突的变量,或者使用包别名来避免冲突。

方法1:重命名变量

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
)

func main() {
    // 将变量名从 sql 改为其他名称,例如 sqlString
    sqlString := "some string"

    var (
        state             sql.NullString // 现在可以正常编译
        confirmationDelay sql.NullInt64
    )

    // 使用变量
    state.String = "CA"
    state.Valid = true
    confirmationDelay.Int64 = 5
    confirmationDelay.Valid = true

    // 转换为 JSON
    output := struct {
        State             sql.NullString `json:"state"`
        ConfirmationDelay sql.NullInt64  `json:"confirmation_delay"`
    }{
        State:             state,
        ConfirmationDelay: confirmationDelay,
    }

    jsonData, _ := json.Marshal(output)
    fmt.Println(string(jsonData))
}

方法2:使用包别名

package main

import (
    sqlDB "database/sql" // 给 database/sql 包起一个别名
    "encoding/json"
    "fmt"
)

func main() {
    // 现在 sql 可以作为变量名使用
    sql := "some string"

    var (
        state             sqlDB.NullString // 使用别名访问
        confirmationDelay sqlDB.NullInt64
    )

    // 使用变量
    state.String = "NY"
    state.Valid = true
    confirmationDelay.Int64 = 10
    confirmationDelay.Valid = false

    // 转换为 JSON
    output := struct {
        State             sqlDB.NullString `json:"state"`
        ConfirmationDelay sqlDB.NullInt64  `json:"confirmation_delay"`
        SQLVar            string           `json:"sql_var"`
    }{
        State:             state,
        ConfirmationDelay: confirmationDelay,
        SQLVar:            sql,
    }

    jsonData, _ := json.Marshal(output)
    fmt.Println(string(jsonData))
}

检查你的代码中是否在其他地方(可能是函数内部或同一作用域内)声明了名为 sql 的变量。如果找到这样的变量,按照上述方法重命名或使用包别名即可解决编译错误。

回到顶部