Golang Go语言中goland里怎么用log输出结构数据
Golang Go语言中goland里怎么用log输出结构数据
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]
最后似乎是内存地址,而不是结构体的数据,我该怎么做?
更多关于Golang Go语言中goland里怎么用log输出结构数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html
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
更多关于Golang Go语言中goland里怎么用log输出结构数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
直接 log.Println 不就行了吗
data 用*解引用试一试,*data)
我代码里面已经写了%+v
Println 也是一样,输出的是地址
改成
log.Printf(“handleInstrument %v / %+v”, symbol, *data)
报错
# command-line-arguments
.\main.go:79:50: invalid indirect of data (type []*ws.Instrument)
你的 data 好像是指针数组啊,输出的当然是地址了。。。你不得取出一个数组元素,然后取他的值吗?
o, 看错了,你这个是个切片,只能用循环一个一个处理了
我刚发出去就发现了, 想撤回来不及了… 暂时想到的是开个函数把指针转字符串…
<br>package main<br><br>import (<br> "log"<br>)<br><br>type user struct {<br> Name string `json:"name"`<br>}<br><br>func main() {<br> u := user{Name:"v2ex"}<br> log.Printf("output %+v",u)<br>}<br><br><br>2019/10/23 16:41:47 output {Name:v2ex}<br>
实现 Stringer 接口就行
data 是 slice,如果对格式要求不高,%s 应该可以。格式要求高的话就转 json 或者循环打印了
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)
}
加接口好使…
#11 学到了
%#v 可以直接打印结构信息
不过不看看结构化日志?
zap、zerolog、logrus
zap 可以
如果仅仅是调试的话,可以看看这个包 https://github.com/davecgh/go-spew
使用 logrus: logrus.WithField(“obj”,v).Info(“my json struct”)
在Go语言中使用log
包输出结构数据(如结构体、map等),通常需要先将这些数据转换为字符串格式,因为log
包的基础接口不支持直接打印复杂数据结构。你可以使用fmt.Sprintf
或encoding/json
包来实现这一转换。
使用fmt.Sprintf
fmt.Sprintf
可以将结构数据格式化为字符串,然后再通过log.Println
或log.Printf
输出。
package main
import (
"fmt"
"log"
)
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
log.Println(fmt.Sprintf("%+v", p)) // %+v 会输出结构体的字段名和值
}
使用encoding/json
另一种更通用的方法是使用json.Marshal
将结构数据转换为JSON字符串,这样输出不仅人类可读,也便于机器解析。
package main
import (
"encoding/json"
"log"
)
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
jsonData, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
log.Println(string(jsonData))
}
这两种方法都可以有效地在GoLand的日志输出中打印结构数据,选择哪种方式取决于你的具体需求。