在golang中将字符串转换为* uint64

时间:2015-03-10 15:20:05

标签: string pointers go uint64

假设有一个字符串包含uint64类型变量的地址,我们可以将此地址解析回*uint64吗?

例如:

i := uint64(23473824)
ip := &i
str := fmt.Sprintf("%v", ip)

u, _ := strconv.ParseUint(str, 0, 64)

uuint64。如何从这个值中获取指针?

游乐场链接:https://play.golang.org/p/1KXFQcozRk

3 个答案:

答案 0 :(得分:3)

你可以用

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

playground link

虽然我不知道Go为您提供了这样一个指针的有效性,但我也不会想到应该使用此代码的任何用例..

答案 1 :(得分:3)

基于nos answer

虽然技术上可行,但有理由不相信您编写的代码。垃圾收集将使用您指向的内存(使用字符串)。

查看以下代码的结果。

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

答案 2 :(得分:2)

它很简单:

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

然后进行一些错误检查,希望对您有所帮助。