jinak me jeste napadlo. Mit slice s runama a tam appendovat a nakonec prevest na string. To ale asi nebude zadna vyhra oproti tomu Builderu (btw diky, jako tusil jsem, ze to existuje, ale clovek zapomina).
Taky jde mít slice řetězců a ty pak spojit (strings.Join). Možností je hodně a těžko říct, co je lepší. Navíc implementace (a s tím efektivita) se může měnit napříč verzemi překladače/standardní knihovny.
to je pravda, ovšem základní myšlenka "pokud dopředu znáš výslednou délku řetězce, můžeš runtimu pomoci" myslím pořád platí. Jakkoli je algoritmus pro odvození délky bufferu skvělý, těžko odhadne to, co může developer znát dopředu.
To, plus tam jsou unsafe optimalizace (vyhnutí se kopírování), v podstatě *(*string)(pointerFromUintptrToSliceData), v Go 1.20 ten kód trochu zcivilizovali, ale chová se stejně.
Problém je, že řetězce jsou v Go immutable, jinak by se konkatenace mohla chovat jako append u řezů. Tak ostatně strings.Builder funguje (a na konci se vyhne kopírování).
Tak jasně, mělo by to různé konsekvence, které by asi vedly k něčemu jako v Rustu (více typů pro řetězce, mut vs. const apod.). Současný stav je hezky jednoduchý a asi nejlepší volba.