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
It is as simple as:
number, err := strconv.ParseUint(string("90"), 10, 64)
then do some error checking, hope it helps.
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..
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?
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.