如何解决Go指针减法
当我运行这个程序时,看起来两个指针的值相距 16 个字节 (x'10") 个字节,但是如果第一个字符串超过 16 个字节长怎么办?还是我看错了?
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("Hello,playground")
x := "string 4"
xx := "string2"
y := "string3"
xptr := &x
fmt.Println(xptr)
fmt.Println(*xptr)
xxptr := &xx
fmt.Println(xxptr)
fmt.Println(*xxptr)
fmt.Println("hey")
fmt.Println("hey")
fmt.Println("hey")
fmt.Println("hhey")
fmt.Println("hey")
yptr := &y
fmt.Println(yptr,*yptr)
xxx := math.Pow(2,3)
fmt.Printf("%.6f",xxx)
}
解决方法
程序打印字符串变量的地址,而不是支持字符串的字节数组的地址。字符串变量包含指向字符串数据和字符串长度的指针。字符串变量的结构体现在 reflect.StringHeader 类型中:
type StringHeader struct {
Data uintptr
Len int
}
有关 Go 中字符串内存布局的详细说明,请参阅 Go Data Structures。
在 64 位架构上,字符串变量的大小为 16 字节。
使用unsafe package提取指向字符串数据的指针:
xh := (*reflect.StringHeader)(unsafe.Pointer(&x))
xxh := (*reflect.StringHeader)(unsafe.Pointer(&xx))
fmt.Printf("0x%x %d\n",xh.Data,xh.Len) // prints 0x4c0648 26
fmt.Printf("0x%x %d\n",xxh.Data,xxh.Len) // prints 0x4bcfd4 7
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。