英文:
Go: understanding strings
问题
我今天早上对以下代码的工作原理感到有些困惑。
// s指向内存中的一个空字符串
s := new(string)
// 将1000字节的字符串分配给该地址
b := make([]byte, 0, 1000)
for i := 0; i < 1000; i++ {
if i%100 == 0 {
b = append(b, '\n')
} else {
b = append(b, 'x')
}
}
*s = string(b)
// 它是如何在那里有空间的?
print(*s)
http://play.golang.org/p/dAvKLChapd
我觉得我在这里漏掉了一些明显的东西。希望能得到一些见解。
英文:
I got slightly confused this morning when the following code worked.
// s points to an empty string in memory
s := new(string)
// assign 1000 byte string to that address
b := make([]byte, 0, 1000)
for i := 0; i < 1000; i++ {
if i%100 == 0 {
b = append(b, '\n')
} else {
b = append(b, 'x')
}
}
*s = string(b)
// how is there room for it there?
print(*s)
http://play.golang.org/p/dAvKLChapd
I feel like I'm missing something obvious here. Some insight would be appreciated.
答案1
得分: 8
我希望我理解了这个问题...
字符串类型的实体由一个运行时结构体实现,大致如下:
type rt_string struct {
ptr *byte // 字符串的第一个字节
len int // 字符串的字节数
}
这行代码
*s = string(b)
在*s处设置一个新的值(类型为rt_string)。它的大小是固定的,所以有“空间”可以存放它。
更多细节可以参考rsc的论文。
英文:
I hope I understood the question...
An entity of type string is implemented by a run time struct, roughly
type rt_string struct {
ptr *byte // first byte of the string
len int // number of bytes in the string
}
The line
*s = string(b)
sets a new value (of type rt_string) at *s. Its size is constant, so there's "room" for it.
More details in rsc's paper.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论