O ile obecnie wiem, idź nie ma sposobu metoda łączenia łańcuchów/bajtów w wynikowy ciąg bez podejmowania co najmniej/dwa/kopie.
Obecnie musisz wyhodować bajt [], ponieważ wszystkie wartości ciągów są const, THEN musisz użyć wbudowanego napisu, aby język utworzył "błogosławiony" obiekt typu string, który skopiuje bufor, ponieważ coś gdzieś może mieć odniesienie do adresu wspierającego bajt [].
Jeśli odpowiedni jest bajt [], możesz uzyskać bardzo niewielką przewagę nad bajtami. Funkcja JOIN, wykonując jedną alokację i wykonując kopię, wywołuje sam siebie.
package main
import (
"fmt"
)
func main() {
m := make(map[int]string)
m[1] = "a" ; m[2] = "b" ; m[3] = "c" ; m[4] = "d"
ip := 0
/* If the elements of m are not all of fixed length you must use a method like this;
* in that case also consider:
* bytes.Join() and/or
* strings.Join()
* They are likely preferable for maintainability over small performance change.
for _, v := range m {
ip += len(v)
}
*/
ip = len(m) * 1 // length of elements in m
r := make([]byte, ip, ip)
ip = 0
for _, v := range m {
ip += copy(r[ip:], v)
}
// r (return value) is currently a []byte, it mostly differs from 'string'
// in that it can be grown and has a different default fmt method.
fmt.Printf("%s\n", r)
}
zamiast „_” w pętli for, nazywają to idx i rów IDX ++ działalność –
Nie, nie mogę, gdy wahają się nad mapą powraca klucz, wartość nie indeksu wartości. W jego przykładzie używa on 1 jako pierwszego klucza, co spowoduje, że indeksy w wycinku v będą niepoprawne, ponieważ indeks początkowy będzie wynosił 1, a nie 4, a gdy osiągnie 4, będzie poza zakresem. https://play.golang.org/p/X8_SbgxK4VX – Popmedic