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

2019-10-23 16:26:02 +08:00
 momox

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]
最后似乎是内存地址,而不是结构体的数据,我该怎么做?

5362 次点击
所在节点    Go 编程语言
18 条回复
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
2019-10-23 16:32:43 +08:00
直接 log.Println 不就行了吗
zhs227
2019-10-23 16:36:05 +08:00
data 用*解引用试一试,*data)
momox
2019-10-23 16:36:44 +08:00
@ClericPy 我代码里面已经写了%+v
momox
2019-10-23 16:37:19 +08:00
@Hanggi Println 也是一样,输出的是地址
momox
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
2019-10-23 16:41:03 +08:00
@momox 你的 data 好像是指针数组啊,输出的当然是地址了。。。你不得取出一个数组元素,然后取他的值吗?
zhs227
2019-10-23 16:41:57 +08:00
o, 看错了,你这个是个切片,只能用循环一个一个处理了
ClericPy
2019-10-23 16:43:12 +08:00
@momox 我刚发出去就发现了, 想撤回来不及了... 暂时想到的是开个函数把指针转字符串...
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
2019-10-23 16:48:48 +08:00
实现 Stringer 接口就行
baiyi
2019-10-23 16:50:09 +08:00
data 是 slice,如果对格式要求不高,%s 应该可以。格式要求高的话就转 json 或者循环打印了
ClericPy
2019-10-23 16:53:17 +08:00
@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
2019-10-23 16:54:07 +08:00
@xfriday #11 学到了
gamexg
2019-10-23 20:36:20 +08:00
%#v 可以直接打印结构信息

不过不看看结构化日志?
zap、zerolog、logrus
Pythondr
2019-10-23 21:19:28 +08:00
zap 可以
hawken
2019-10-23 21:41:34 +08:00
如果仅仅是调试的话,可以看看这个包 https://github.com/davecgh/go-spew
not4jerk
2019-10-24 10:09:34 +08:00
使用 logrus: logrus.WithField("obj",v).Info("my json struct")

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/612151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX