reflect.Value的String方法不按预期工作。

huangapple go评论97阅读模式
英文:

String method of reflect.Value does not work as expected

问题

我正在尝试从reflect.Value中获取字符串值,

我期望value.String()的结果是okok,但实际上我得到的是<interface {} Value>

我错过了什么吗?

package main

import (
    "fmt"
    "reflect"
)

func dump(args *[]interface{}) {
    value := reflect.ValueOf(*args).Index(0)
    fmt.Println(value.String())
    if value.String() != "okok" {
        fmt.Println("miss")
    }
}

func main() {
    var args []interface{}
    args = append(args, "okok")
    dump(&args)
}
英文:

I'm trying to retrieve the string value from a reflect.Value,

I expect value.String() to be okok but I got &lt;interface {} Value&gt; instead.

Did I miss something?

package main

import (
    &quot;fmt&quot;
    &quot;reflect&quot;
)

func dump(args *[]interface{}) {
    value := reflect.ValueOf(*args).Index(0)
    fmt.Println(value.String())
    if value.String() != &quot;okok&quot; {
        fmt.Println(&quot;miss&quot;)
    }
}

func main () {
    var args []interface{}
    args = append(args, &quot;okok&quot;)
    dump(&amp;args)
}

答案1

得分: 5

Value.String 的文档解释了其行为:

与其他的获取器不同,如果 v 的类型不是字符串,它不会引发 panic。相反,它返回一个形如 "" 的字符串,其中 T 是 v 的类型。

String 只是 fmt.Stringer 接口的一个实现。

如果你想要获取值本身,你可以在 reflect.Value 上使用 Interface 函数,然后进行类型断言以获取字符串。示例代码如下:

package main

import (
	"fmt"
	"reflect"
)

func dump(args *[]interface{}) {
	value := reflect.ValueOf(*args).Index(0)
	str := value.Interface().(string)
	fmt.Println(str)
	if str != "okok" {
		fmt.Println("miss")
	}
}

func main() {
	var args []interface{}
	args = append(args, "okok")
	dump(&args)
}

Playground 链接

英文:

The documentation for Value.String explains the behavior:

> Unlike the other getters, it does not panic if v's Kind is not String.
> Instead, it returns a string of the form "&lt;T value>" where T is v's
> type.

String is just an implementation of the fmt.Stringer interface.

If you want the value itself, you can use the Interface function on reflect.Value and then do a type assertion to get the string. Example:

package main

import (
	&quot;fmt&quot;
	&quot;reflect&quot;
)

func dump(args *[]interface{}) {
	value := reflect.ValueOf(*args).Index(0)
	str := value.Interface().(string)
	fmt.Println(str)
	if str != &quot;okok&quot; {
		fmt.Println(&quot;miss&quot;)
	}
}

func main() {
	var args []interface{}
	args = append(args, &quot;okok&quot;)
	dump(&amp;args)
}

Playground link

huangapple
  • 本文由 发表于 2016年4月30日 17:50:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/36953337.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定