Go:理解字符串

huangapple go评论86阅读模式
英文:

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 &lt; 1000; i++ {
	if i%100 == 0 {
		b = append(b, &#39;\n&#39;)
	} else {
		b = append(b, &#39;x&#39;)
	}
}
*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.

huangapple
  • 本文由 发表于 2013年4月19日 22:15:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/16106748.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定