登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-02-27 21:51:24 296浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go 如何解析看似相同的类型?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我有一个包含 2 列的 postgresql 数据库:id (uuid)、company_url (varchar),其值如下:

2fc35af4-5f5c-445e-86c5-01d93513b8be | https://test.com
2bf31b75-d1f3-4a9c-a530-73b714816e9e | https://test2.com

以下是使用 go 访问表的代码(为简单起见,省略了错误处理和凭据):

package main

import (
    "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() 也没有进行任何隐式更改。


正确答案


严格来说,它们不是同一类型。但他们有相同的 underlying typeUUID 的不同之处在于它有 implements 接口 sql.Scannerdriver.Valuer,因此它可以与数据库透明地使用。

终于介绍完啦!小伙伴们,这篇关于《Go 如何解析看似相同的类型?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>