Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 打印时如何取消引用字段?_Go_Printf - Fatal编程技术网

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)
}