Reputation: 3614
Assume there is a string holding the address of an uint64
type variable, can we parse this address back to an *uint64
?
For example:
i := uint64(23473824)
ip := &i
str := fmt.Sprintf("%v", ip)
u, _ := strconv.ParseUint(str, 0, 64)
u
is uint64
. How to get pointer out of this value?
Playground link: https://play.golang.org/p/1KXFQcozRk
Upvotes: 15
Views: 37032
Reputation: 438
It is as simple as:
number, err := strconv.ParseUint(string("90"), 10, 64)
then do some error checking, hope it helps.
Upvotes: 19
Reputation: 49231
Based on nos answer.
Although it is technically possible there are reasons not to trust the code you wrote. Garbage collection will use the memory you point to (with string).
Take a look at result of the following code.
package main
import(
"fmt"
"strconv"
"reflect"
"unsafe"
)
func produce() string {
i := uint64(23473824)
ip := &i
str := fmt.Sprintf("%v", ip)
fmt.Println(i, ip, str)
return str
}
func main() {
str := produce()
for i := 0; i < 10; i++ {
x := make([]int, 1024*1024)
x[0] = i
}
u, _ := strconv.ParseUint(str, 0, 64)
ip := (*uint64)(unsafe.Pointer(uintptr(u)))
fmt.Println(ip,*ip, reflect.TypeOf(u)) // u is uint64, how to get pointer out of this value?
}
https://play.golang.org/p/85XOhsMTf3
Upvotes: 4
Reputation: 229264
You can do it with
ip = (*uint64)(unsafe.Pointer(uintptr(u)))
Albeit I don't know what guarantees Go gives you about the validity of such a pointer, nor can I think of any use case where this code should be used..
Upvotes: 4