Go语言:重复字符串常量编译

时间:2015-07-17 16:08:05

标签: go

我正在考虑为Go代码生成器编写模板并且想知道:

如果我有许多字符串常量和/或具有相同值的变量,它们会多次存储在可执行文件中,或者编译器会进行优化并且每个副本只存储1个实例并在需要的地方引用它?

E.g。

File1.go
========
s1 := "some_string_1"
s2 := "some_string_2"

FileN.go
========
a1 := "some_string_1"
a1 := "some_string_2"

如果我有多个具有相同常量的文件,或者编译器是否足够聪明以进行优化,是否会影响文件大小?

想象一下,在许多模板中我都有类似的东西:

Template 1
==========
{% for a in list1 %}<td>{{a}}</td>{% endfor %}

Tempalte 2
==========
{% for b in list2 %}<td>{{b.c}}</td><td>{{b.d}}</td>{% endfor %}

将被翻译为:

for i, a := range list {
    write("<td>")
    write(a)
    write("</td>")
}

for i, b := range list2 {
    write("<td>")
    write(b.c)
    write("</td></td>")
    write(b.d)
    write("</td>")
}

显然<td>&amp; </td>将在代码中重复多次。那么创建一个全局字符串数组并从中获取值是否有意义?类似的东西:

myStrings := [...]string{
    "<td>",
    "</td>"
}
for i, a := range list {
    write(myStrings[0])
    write(a)
    write(myStrings[1])
}

1 个答案:

答案 0 :(得分:2)

语言规范没有说明字符串常量或文字的内部存储。根据这个讨论,我认为目前没有语言实习; https://github.com/golang/go/issues/5160虽然现在有点过时了。

同样的搜索出现了这个你可能会觉得有用的项目; https://gist.github.com/karlseguin/6570372