String 有没有办法判断两个字符串在Go中是否共享内存?

String 有没有办法判断两个字符串在Go中是否共享内存?,string,go,equality,String,Go,Equality,在Go中,字符串在内部存储为C结构: struct String // This is C code (not Go) { byte* str; int32 len; }; 假设我有以下变量: a0 := "ap" // This is Go code a1 := "ple" b0 := "app" b1 := "le" a := a0 + a1 b := b0 + b1 c := "apple" d := c 然后输入以下代码: fmt.Println("a == b = %t,

在Go中,字符串在内部存储为C结构:

struct String // This is C code (not Go)
{
  byte* str;
  int32 len;
};
假设我有以下变量:

a0 := "ap" // This is Go code
a1 := "ple"
b0 := "app"
b1 := "le"
a := a0 + a1
b := b0 + b1
c := "apple"
d := c
然后输入以下代码:

fmt.Println("a == b = %t, &a == &b = %t", a == b, &a == &b)
fmt.Println("c == d = %t, &c == &d = %t", c == d, &c == &d)
产出:

a == b = true, &a == &b = false
c == d = true, &c == &d = false
因为
&a==&b
比较C结构的地址,而
a==b
比较字符串的值


是否有任何方法可以测试字符串本身是否存储在相同的位置(即C-struct中的
str
字段具有相同的值),以便比较
a
b
最有可能产生
false
,比较
c
d
几乎肯定会得出
true

是的,这是可能的。使用reflect包并获取两个
字符串的。然后可以比较
数据
Len
字段,以计算字符串支持数组在内存中是否重叠

注意:
StringHeader
struct是一个实现细节,语言规范中没有提到它。因此,任何做上面段落中讨论的事情的代码都不是真正的可移植的。注意,我不鼓励在文档中的好奇心/研究等之外使用此类代码:

StringHeader是字符串的运行时表示形式。它不能安全或可移植地使用,其表示形式可能会在以后的版本中更改。此外,数据字段不足以保证它引用的数据不会被垃圾收集,因此程序必须保留一个单独的、正确键入的指向底层数据的指针

编辑:

string
实例
str
获取
*reflect.StringHeader
hdr
的未测试代码:

hdr := (*reflect.StringHeader)(unsafe.Pointer(&str))

是的,有可能。使用reflect包并获取两个
字符串的。然后可以比较
数据
Len
字段,以计算字符串支持数组在内存中是否重叠

注意:
StringHeader
struct是一个实现细节,语言规范中没有提到它。因此,任何做上面段落中讨论的事情的代码都不是真正的可移植的。注意,我不鼓励在文档中的好奇心/研究等之外使用此类代码:

StringHeader是字符串的运行时表示形式。它不能安全或可移植地使用,其表示形式可能会在以后的版本中更改。此外,数据字段不足以保证它引用的数据不会被垃圾收集,因此程序必须保留一个单独的、正确键入的指向底层数据的指针

编辑:

string
实例
str
获取
*reflect.StringHeader
hdr
的未测试代码:

hdr := (*reflect.StringHeader)(unsafe.Pointer(&str))

string
s的插入程度是Go编译器实现细节。对于当前的
gc
gccgo
编译器,相同的
string
文本在编译和链接时被插入。运行时生成的其他
string
文本和
string
s未被插入。

插入
string
s的程度是Go编译器的实现细节。对于当前的
gc
gccgo
编译器,相同的
string
文本在编译和链接时被插入。运行时生成的其他
string
literal和
string
s未被实习。

谢谢!你会用它把
字符串
转换成
字符串头
?@Matt:Go中没有转换。请看更新的答案。再问一个问题,所有的演员都有开销吗?谢谢!你会用它把
字符串
转换成
字符串头
?@Matt:Go中没有转换。请查看更新后的答案。还有一个问题,所有这些转换是否有任何开销?这不是我的问题。要正确解释
str
相等性测试的结果,需要知道的重要信息。如果我希望字符串被插入,那么为什么我需要检查它们是否共享内存?这不是我的问题。为了正确解释
str
相等性测试的结果,需要知道重要的信息。如果我希望字符串被保留,那么为什么我需要检查它们是否共享内存?