资讯专栏INFORMATION COLUMN

golang -- mgo解析各种数据类型分析

xcold / 3172人阅读

摘要:无法打开和都是,也就是说它们可以指向任意类型,此时是指向结构的指针是具体此时是指针,指向的类型是会把当成对待所有域的信息都会输出来此时是指向结构的指针只有确定了类型后,才会当成具体类型只有确定了类型后,才会当成具体类型输出结果如下

package main

import (
    "gopkg.in/mgo.v2"
    "log"
    "reflect"
)

func main() {
    session, err := mgo.Dial("usr:pwd@127.0.0.1:27017/dbname")
    if err != nil {
        log.Fatal("无法打开MongoDB!")
        return
    }
    defer session.Close()

    clt := session.DB("mydb").C("userinfo")
    type row struct {
        UserName, 
        Telephone string
    }

    var _row, _row2 interface{}
    // _row和_row2 都是interface,也就是说它们可以指向任意类型,此时是指向row结构的指针
    _row = new(row)
    _row2 = new(row)
    // _row3 是具体struct
    _row3 := row{}
    
    log.Printf("type of &row: %v
", reflect.TypeOf(&_row))
    log.Printf("type of row:  %v
", reflect.TypeOf(_row2))
    log.Printf("type of &row3: %v
", reflect.TypeOf(&_row3))

    it := clt.Find(nil).Limit(1).Iter()
    log.Println("test unmarshal using", reflect.TypeOf(&_row))
    for it.Next(&_row) {
        // 此时&_row是指针,指向的类型是interface 
        // mongo会把row当成map对待, 所有域的信息都会输出来
        log.Println(_row)
    }
    
    it = clt.Find(nil).Limit(1).Iter()
    log.Println("test unmarshal using", reflect.TypeOf(_row2))
    for it.Next(_row2) {
        // 此时row2是指向row结构的指针
        // 只有确定了类型后,才会当成具体类型
        log.Println(_row2)
    }

    it = clt.Find(nil).Limit(1).Iter()
    log.Println("test unmarshal using", reflect.TypeOf(&_row3))
    for it.Next(&_row3) {
        // 只有确定了类型后,才会当成具体类型
        log.Println(_row3)
    }
}

输出结果如下:

2016/04/28 16:23:22 type of &row: *interface {}
2016/04/28 16:23:22 type of row:  *main.row
2016/04/28 16:23:22 type of &row3: *main.row
2016/04/28 16:23:22 test unmarshal using *interface {}
2016/04/28 16:23:22 map[_id:ObjectIdHex("5721c757a8917850b210f0ca") username:xiaoming telephone:2222 address:beijing]
2016/04/28 16:23:22 test unmarshal using *main.row
2016/04/28 16:23:22 &{xiaoming  2222}
2016/04/28 16:23:22 test unmarshal using *main.row
2016/04/28 16:23:22 {xiaoming  2222}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18839.html

相关文章

  • golang基础学习-MongoDB使用

    摘要:如果删除所有用替换其他写了一个和结合的数据查询服务细节可点击链接到查看 1.系统环境 Golang:go version go1.10.3 darwin/amd64 OS:MacOS MongoDB: version: 3.4.4 2.Golang使用MongoDB 使用:gopkg.in/mgo.v2 获取包:go get gopkg.in/mgo.v2 引入:impor...

    LinkedME2016 评论0 收藏0
  • Golang mgo驱动指定Mongo服务器读取

    摘要:搭建服务器采用搭建,可参考读模式的读模式共有五种在主节点上进行所有的读操作优先在主节点上进行读操作,如果主节点不可用,再从从节点操作。 Replica Sets搭建 服务器采用Replica Sets搭建,可参考Deploy a Replica Set 读模式 Mongod的读模式共有五种: primary. 在主节点上进行所有的读操作 primaryPreferred. 优...

    rollback 评论0 收藏0
  • 用Go语言借助mgo实现一个对MongoDB进行增删改查的demo

    摘要:准备数据结构这个以对一个简单的通讯录进行插入查询更新删除记录为例,中包含和两个字段下载还没出官方的驱动包,是现在比较流行的第三方包,能找到的相关资料也比较多。准备实现对的增删改查操作,先想了下怎么写测试案例。查找,通过查找该条记录。 环境声明:go version go1.11MongoDB server version 4.0.3 背景 这是我第一次接触golang和MongoDB,...

    Jingbin_ 评论0 收藏0
  • Golang 微服务教程(三)

    摘要:本节将学习来统一管理和部署微服务,引入第三个微服务并进行存储数据。到目前为止,要想启动微服务的容器,均在其中的同时设置其环境变量,服务多了以后管理起来十分麻烦。 译文链接:wuYin/blog原文链接:ewanvalentine.io,翻译已获作者 Ewan Valentine 授权。 本文完整代码:GitHub 在上节中,我们使用 go-micro 重新实现了微服务并进行了 Doc...

    Drummor 评论0 收藏0
  • 利用mongo的findAndModify原子性操作实现auto increment ID

    摘要:实际情况默认情况下,使用自动生成,而且在自带的命令里,无法指定一个自增字段。自增字段在多线程时必须是原子性的,这在大数据情况下很难实现伸缩性。而且,在里面,有一个命令是原子性的。代码如下无法打开创建个模拟多线程环境输出查询结果 实际情况 默认情况下,mongo使用_id自动生成uniq id,而且在mongo自带的命令里,无法指定一个自增字段。自增字段在多线程时必须是原子性的,这在大数...

    genedna 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<