为了账号安全,请及时绑定邮箱和手机立即绑定

Go 如何解决看似相同的类型?

Go 如何解决看似相同的类型?

Go
慕容708150 2023-03-15 15:03:02
我有一个包含 2 列的 PostgreSQL 数据库:id (UUID)、company_url (varchar) 具有以下值:2fc35af4-5f5c-445e-86c5-01d93513b8be | https://test.com2bf31b75-d1f3-4a9c-a530-73b714816e9e | https://test2.com下面是使用 Go 访问表的代码(为简单起见,省略了错误处理和凭据):package mainimport (    "fmt"    "database/sql"    "github.com/google/uuid"    _ "github.com/lib/pq")func main() {    connStr := "host= password= port= dbname= user="    db, _ := sql.Open("postgres", connStr)    rows, _ := db.Query("SELECT * FROM companies;")    for rows.Next() {        // var id [16]byte // not ok        var id uuid.UUID // ok        var companyURL string        rows.Scan(&id, &companyURL)        fmt.Println(id, companyURL)    }}还有一个用于UUID的 Go 包。在它的源代码中,UUID 被简单地定义为type UUID [16]byte在上面的代码中, id是使用 键入的uuid.UUID,我试图替换上面代码中的类型声明(用 注释掉not ok),但它返回的不是正确的值,而是一个包含 16 个零的数组。uuid.UUID返回正确的 ID。uuid.UUID所以我的问题是,如果和[16]byte属于同一类型,为什么会有这种行为?uuid 包中没有二进制文件,也没有init()函数,也没有Scan()进行任何隐式更改。
查看完整描述

1 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

严格来说,它们不是同一种类型。尽管它们具有相同的基础类型。UUID不同之处在于它实现了接口sql.Scannerdriver.Valuer,因此它可以透明地与数据库一起使用。



查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信