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

19 回复

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.Sprintfencoding/json包来实现这一转换。

使用fmt.Sprintf

fmt.Sprintf可以将结构数据格式化为字符串,然后再通过log.Printlnlog.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的日志输出中打印结构数据,选择哪种方式取决于你的具体需求。

回到顶部