Convert string to *uint64 in golang
Asked Answered
C

3

14

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

Comply answered 10/3, 2015 at 15:20 Comment(4)
I don't understand golang, but is this page helpful (#5368461)? It deals with casting pointers.Triune
Thank you, but unfortunately they are not related.Comply
but why would you need to do this?Faires
@Faires that's a great question, but let's just say I was on the dark side once.Comply
H
19

It is as simple as:

number, err := strconv.ParseUint(string("90"), 10, 64)

then do some error checking, hope it helps.

Hollyanne answered 16/4, 2020 at 18:44 Comment(1)
this doesn't work if uint is a 32-bit type, so it won't work in 32-bit buildsElviaelvie
P
4

You can do it with

 ip = (*uint64)(unsafe.Pointer(uintptr(u)))

playground link

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..

Phototube answered 10/3, 2015 at 15:34 Comment(0)
R
4

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

Russo answered 10/3, 2015 at 15:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.