在我的代码中,我得到了一个js.Value
,它是一个简单的对象{"Age":19}
为了显示它,我使用了:
data := fmt.Sprintf("Age: %v", value.Get("age"))
fmt.Println(data)
但结果是:
Age: <number: 19>
预期输出为:
Age: 19
有一次我把%v
换成了%d
,变成了
data := fmt.Sprintf("Age: %v", value.Get("age"))
fmt.Println(data)
我得到了:
Age: {[] 4626041242239631360 0}
js.Value.Get
再次返回一个js.Value
,js.Value
实现fmt.Stringer
接口。您看到的输出是在封装js.TypeNumber
的实例上调用Value.String()
的结果
字符串以字符串形式返回值v。由于Go的String方法约定,String是一种特殊情况。与其他getter不同,如果v的Type不是TypeString,它不会死机。相反,它返回一个形式的字符串""或"<T: V>quot;其中T是v的类型,v是v值的字符串表示。
使用Value.Int()
或Value.Float()
打开数值:
data := fmt.Printf("Age: %d", value.Get("age").Int())
相反,{[] 4626041242239631360 0}
是Value
结构本身及其内部的字符串表示。供参考:
type Value struct {
_ [0]func() // uncomparable; to make == not compile
ref ref // identifies a JavaScript value, see ref type
gcPtr *ref // used to trigger the finalizer when the Value is not referenced any more
}
js.Value
的文档显示Get
的结果是另一个Value
结构,而不是整数。因此,当您使用%v打印生成的js.Value
时,它会转到js.Value
的默认格式化程序,该格式化程序会打印类型以及值。
当您明确告诉它将其打印为%d时,它会将Value结构打印为数字,在这种情况下,这意味着一个空数组——ref
结构和*ref
指针,正如您在代码中看到的:https://golang.org/src/syscall/js/js.go
您可能想要的是调用Int()
方法,该方法以整数形式返回值:
data := fmt.Sprintf("Age: %d, value.Get("Age").Int())
fmt.Println(data)