In my code I'm getting a js.Value that is a simple object {"Age":19}
For displaying it, I used:
data := fmt.Sprintf("Age: %v", value.Get("age"))
fmt.Println(data)
But the output was:
Age: <number: 19>
Expected output is:
Age: 19
Once I replaced the %v by %d to be:
data := fmt.Sprintf("Age: %v", value.Get("age"))
fmt.Println(data)
I got:
Age: {[] 4626041242239631360 0}
CodePudding user response:
js.Value.Get returns a js.Value again, and js.Value implements fmt.Stringer interface. The output you see is the result of calling Value.String() on an instance that wraps js.TypeNumber
String returns the value v as a string. String is a special case because of Go's String method convention. Unlike the other getters, it does not panic if v's Type is not TypeString. Instead, it returns a string of the form "" or "<T: V>" where T is v's type and V is a string representation of v's value.
Use Value.Int() or Value.Float() to unwrap the numerical value:
data := fmt.Printf("Age: %d", value.Get("age").Int())
This instead {[] 4626041242239631360 0} is the string representation of the Value struct itself with its internals. For reference:
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
}
CodePudding user response:
The documentation for js.Value shows that the result of Get is another Value struct, and not an integer. So when you print the resulting js.Value with %v, it goes to the default formatter for a js.Value, which prints the type as well as the value.
When you explicitly told it to print it as %d, it prints the Value struct as numbers, which in this case means an empty array a ref struct and a *ref pointer, as you can see in the code:
https://golang.org/src/syscall/js/js.go
What you probably want is to call the Int() method, which returns the value as an integer:
data := fmt.Sprintf("Age: %d, value.Get("Age").Int())
fmt.Println(data)
