Go 打印时如何取消引用字段?
这将打印一个如下的内存地址Go 打印时如何取消引用字段?,go,printf,Go,Printf,这将打印一个如下的内存地址{0x10500168} 有没有办法让它打印出来: {{“我想看看这里有什么”} 这主要是为了调试,如果我有一个包含30个指针字段的结构,我不想对30个字段中的每一个都进行println来查看其中的内容 package main import ( "fmt" ) type SomeTest struct { someVal string } func (this *SomeTest) String() string { return th
{0x10500168}
有没有办法让它打印出来:
{{“我想看看这里有什么”}
这主要是为了调试,如果我有一个包含30个指针字段的结构,我不想对30个字段中的每一个都进行println来查看其中的内容
package main
import (
"fmt"
)
type SomeTest struct {
someVal string
}
func (this *SomeTest) String() string {
return this.someVal
}
func main() {
fmt.Println(&SomeTest{"You can see this now"})
}
提供
Stringer
的任何内容都将使用其String()方法打印。要实现stringer,您只需要实现String()String
。要想做你想做的事,你必须为SomeStruct
实现Stringer
(在你的例子中,取消对somePointer
的引用并对其进行处理)。有一个很棒的包叫做。这正是你想要的
package main
import (
"github.com/davecgh/go-spew/spew"
)
type (
SomeStruct struct {
Field1 string
Field2 int
Field3 *somePointer
}
somePointer struct {
field string
}
)
func main() {
s := SomeStruct{
Field1: "Yahoo",
Field2: 500,
Field3: &somePointer{"I want to see what is in here"},
}
spew.Dump(s)
}
将为您提供以下输出:
(main.SomeStruct) {
Field1: (string) "Yahoo",
Field2: (int) 500,
Field3: (*main.somePointer)(0x2102a7230)({
field: (string) "I want to see what is in here"
})
}
您正试图打印包含指针的结构。当您打印结构时,它将打印包含的类型的值——在本例中是字符串指针的指针值 不能在结构中取消对字符串指针的引用,因为它不再由结构准确描述,也不能取消对结构的引用,因为它不是指针 您可以做的是取消对字符串指针的引用,但不能从结构中取消引用
func main() {
pointer := SomeStruct{&somePointer{"I want to see what is in here"}}.somePointer
fmt.Println(*pointer)
}
输出:{我想看看这里有什么}
您也可以只打印Println中的特定值:
func main() {
fmt.Println(SomeStruct{&somePointer{"I want to see what is in here"}}.somePointer)
}
输出:&{我想看看这里有什么}
另一种尝试是Printf:
func main() {
structInstance := SomeStruct{&somePointer{"I want to see what is in here"}}
fmt.Printf("%s",structInstance)
}
输出:
{%!s(*main.somePointer=&{我想看看这里有什么})
我本来想回答同样的问题,但结果是,如果将类型包装在外部结构中,它仍然只打印指针:。@joshlf13我的建议实际上是自己实现字符串,以获得他想要的行为。也许有一个更优雅的解决方案,但这一个肯定有效。如果投票人能解释一下他认为这个答案有什么错?这当然不是神奇的,但它是有效的。我怀疑没有任何简单的方法(Println必须跟踪循环指针,如果它可以跟踪这样的指针),您必须实现func(p*SomeStruct)String()String
对于外部SomeStuct
fmt.Printf(“%+v”,somesstruct{&somespointer{“我想看看这里有什么”}})
使用%+v打印出所有属性及其名称。如果您只执行%v,它将只显示值实际上我可能错了,它将值显示为内存位置,因为您是通过引用传递它的&somePointer{“
哇,我不知道这个包。很好!这是一个难以置信的库。这正是我需要的,而且很容易实现。
func main() {
structInstance := SomeStruct{&somePointer{"I want to see what is in here"}}
fmt.Printf("%s",structInstance)
}