V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
momox
V2EX  ›  Go 编程语言

goland 里面怎么用 log 输出结构数据

  •  1
     
  •   momox · 2019-10-23 16:26:02 +08:00 · 5554 次点击
    这是一个创建于 1892 天前的主题,其中的信息可能已经有所发展或是发生改变。

    type Instrument struct {

    Symbol     string  `json:"symbol"`
    MarkPrice  float64 `json:"mark_price"`
    IndexPrice float64 `json:"index_price"`
    

    }

    func handleInstrument(symbol string, data []*ws.Instrument) {

    log.Printf("handleInstrument %v / %+v", symbol, data)
    

    }

    打印出来是:2019/10/23 16:12:56 handleInstrument BTCUSD / [0xc0000fd3c0]
    最后似乎是内存地址,而不是结构体的数据,我该怎么做?

    18 条回复    2019-10-24 10:09:34 +08:00
    ClericPy
        1
    ClericPy  
       2019-10-23 16:32:12 +08:00
    struct 如果没记错默认是个引用的, 和 py 里的很多可变对象一样
    https://stackoverflow.com/questions/24512112/how-to-print-struct-variables-in-console
    Google 搜的 Print struct golang

    %v 改成 %+v

    p = Project{...}
    fmt.Printf("%+v", p)
    fmt.Printf("%#v", p) //with type
    Hanggi
        2
    Hanggi  
       2019-10-23 16:32:43 +08:00
    直接 log.Println 不就行了吗
    zhs227
        3
    zhs227  
       2019-10-23 16:36:05 +08:00
    data 用*解引用试一试,*data)
    momox
        4
    momox  
    OP
       2019-10-23 16:36:44 +08:00
    @ClericPy 我代码里面已经写了%+v
    momox
        5
    momox  
    OP
       2019-10-23 16:37:19 +08:00
    @Hanggi Println 也是一样,输出的是地址
    momox
        6
    momox  
    OP
       2019-10-23 16:39:05 +08:00
    @zhs227

    改成
    log.Printf("handleInstrument %v / %+v", symbol, *data)
    报错
    # command-line-arguments
    .\main.go:79:50: invalid indirect of data (type []*ws.Instrument)
    Hanggi
        7
    Hanggi  
       2019-10-23 16:41:03 +08:00
    @momox 你的 data 好像是指针数组啊,输出的当然是地址了。。。你不得取出一个数组元素,然后取他的值吗?
    zhs227
        8
    zhs227  
       2019-10-23 16:41:57 +08:00
    o, 看错了,你这个是个切片,只能用循环一个一个处理了
    ClericPy
        9
    ClericPy  
       2019-10-23 16:43:12 +08:00
    @momox 我刚发出去就发现了, 想撤回来不及了... 暂时想到的是开个函数把指针转字符串...
    TypeErrorNone
        10
    TypeErrorNone  
       2019-10-23 16:43:52 +08:00
    ```
    package main

    import (
    "log"
    )

    type user struct {
    Name string `json:"name"`
    }

    func main() {
    u := user{Name:"v2ex"}
    log.Printf("output %+v",u)
    }


    2019/10/23 16:41:47 output {Name:v2ex}
    ```
    xfriday
        11
    xfriday  
       2019-10-23 16:48:48 +08:00   ❤️ 3
    实现 Stringer 接口就行
    baiyi
        12
    baiyi  
       2019-10-23 16:50:09 +08:00
    data 是 slice,如果对格式要求不高,%s 应该可以。格式要求高的话就转 json 或者循环打印了
    ClericPy
        13
    ClericPy  
       2019-10-23 16:53:17 +08:00   ❤️ 1
    @xfriday
    @momox
    package main

    import (
    "fmt"
    )

    type Instrument struct {
    A string
    }

    func (inst *Instrument) String() string {
    return fmt.Sprintf("*Instrument{A:%s}", inst.A)
    }
    func handleInstrument(symbol string, data []*Instrument) {
    fmt.Printf("handleInstrument %v / %s", symbol, data)
    }

    // handleInstrument test / [*Instrument{A:a}]

    func main() {
    var ps []*Instrument
    ps = append(ps, &Instrument{A: "a"})
    handleInstrument("test", ps)

    }


    加接口好使...
    baiyi
        14
    baiyi  
       2019-10-23 16:54:07 +08:00
    @xfriday #11 学到了
    gamexg
        15
    gamexg  
       2019-10-23 20:36:20 +08:00
    %#v 可以直接打印结构信息

    不过不看看结构化日志?
    zap、zerolog、logrus
    Pythondr
        16
    Pythondr  
       2019-10-23 21:19:28 +08:00
    zap 可以
    hawken
        17
    hawken  
       2019-10-23 21:41:34 +08:00 via Android
    如果仅仅是调试的话,可以看看这个包 https://github.com/davecgh/go-spew
    not4jerk
        18
    not4jerk  
       2019-10-24 10:09:34 +08:00
    使用 logrus: logrus.WithField("obj",v).Info("my json struct")
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2761 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 13:01 · PVG 21:01 · LAX 05:01 · JFK 08:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.