Sprintf 在 js 上显示<数字:19>而不是 19。价值



在我的代码中,我得到了一个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.Valuejs.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)

最新更新