英文:
Convert string to *uint64 in golang
问题
假设有一个字符串保存了一个 uint64
类型变量的地址,我们能将这个地址解析回 *uint64
类型吗?
例如:
i := uint64(23473824)
ip := &i
str := fmt.Sprintf("%v", ip)
u, _ := strconv.ParseUint(str, 0, 64)
u
是 uint64
类型。如何从这个值中获取指针?
Playground 链接:https://play.golang.org/p/1KXFQcozRk
英文:
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
答案1
得分: 17
这是一个简单的示例:
number, err := strconv.ParseUint(string("90"), 10, 64)
然后进行一些错误检查,希望对你有帮助。
英文:
It is as simple as:
number, err := strconv.ParseUint(string("90"), 10, 64)
then do some error checking, hope it helps.
答案2
得分: 4
你可以使用以下代码实现:
ip = (*uint64)(unsafe.Pointer(uintptr(u)))
尽管我不知道Go语言在指针的有效性方面给出了什么保证,也无法想到任何使用此代码的用例。
英文:
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..
答案3
得分: 4
根据这个答案。
虽然从技术上讲,你编写的代码是可行的,但有一些原因不值得信任。垃圾回收将使用你指向的内存(使用字符串)。请看以下代码的结果。
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 是 uint64 类型,如何从该值中获取指针?
}
英文:
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?
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论