15

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

4
  • I don't understand golang, but is this page helpful (stackoverflow.com/questions/5367961/…)? It deals with casting pointers. Commented Mar 10, 2015 at 15:26
  • Thank you, but unfortunately they are not related. Commented Mar 10, 2015 at 15:30
  • but why would you need to do this? Commented Apr 21, 2018 at 16:38
  • @Rambatino that's a great question, but let's just say I was on the dark side once. Commented Apr 16, 2019 at 16:32

3 Answers 3

20

It is as simple as:

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

then do some error checking, hope it helps.

Sign up to request clarification or add additional context in comments.

1 Comment

this doesn't work if uint is a 32-bit type, so it won't work in 32-bit builds
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..

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.