2016-04-30 50 views
2

我正在嘗試從一個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) 
} 

回答

6

documentation for Value.String說明了其行爲:

不像其他的干將,它不慌如果V的種類沒有字符串。 取而代之,它返回一個格式爲「< T值>」的字符串,其中T是v的 類型。

字符串只是fmt.Stringer接口的實現。

如果你想要這個值本身,你可以在reflect.Value上使用Interface function,然後做一個類型斷言來得到字符串。例如:

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 link

相關問題