我正在考虑为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])
}
答案 0 :(得分:2)
语言规范没有说明字符串常量或文字的内部存储。根据这个讨论,我认为目前没有语言实习; https://github.com/golang/go/issues/5160虽然现在有点过时了。
同样的搜索出现了这个你可能会觉得有用的项目; https://gist.github.com/karlseguin/6570372