Ich möchte String zu Bytes Array zuweisen:
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
Haben Sie eine andere Methode?
Ich möchte String zu Bytes Array zuweisen:
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
Haben Sie eine andere Methode?
Die beste Kodierungspraxis in Go ist die Verwendung eines Byte-Slice []byte
y pas eine Reihe von Bytes [20]byte
bei der Konvertierung einer Zeichenkette in Bytes... Sie glauben mir nicht? Lesen Sie die Antwort von Rob Pike auf dieses Thema
Der OP fragte nach einem Array, nicht nach einem Slice. In einigen Fällen müssen Sie die Größe des Slice begrenzen und stattdessen ein Array verwenden. Meine Antwort unten schneidet die zusätzlichen Zeichen, um sicherzustellen, dass Sie das Array nicht überlaufen.
Für diejenigen, denen das etwas seltsam vorkommt: Das ist nur eine Typkonvertierung in Go: golang.org/ref/spec#Umwandlungen
Zur Konvertierung von einer Zeichenkette in ein Byte-Slice, string -> []byte
:
[]byte(str)
Zur Umwandlung eines Arrays in ein Slice, [20]byte -> []byte
:
arr[:]
Zum Kopieren einer Zeichenkette in ein Array, string -> [20]byte
:
copy(arr[:], str)
Wie oben, jedoch wird die Zeichenkette zuerst explizit in ein Slice umgewandelt:
copy(arr[:], []byte(str))
copy
Funktion kopiert nur zu ein Stückchen, von ein Stückchen.[:]
macht ein Array zu einem Slice.copy
kopiert nur den Teil der Zeichenkette, der passt (und Multi-Byte-Runen werden dann möglicherweise nur teilweise kopiert, was die letzte Rune der resultierenden Zeichenkette beschädigt).Dieser Code:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
...ergibt die folgende Ausgabe:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
Ich habe sie auch auf der Go Spielplatz
Vielleicht möchten Sie ein Beispiel für die Umwandlung eines einzelnen Zeichens hinzufügen. Daraus habe ich abgeleitet, dass b[i] = []byte("A")[0]
funktioniert, aber b[i] = 'A'
ist am Ende viel sauberer.
Eine Frage bleibt offen, die noch niemand beantwortet hat: Ist []byte(str)
erstellt ein neues zugrunde liegendes Array mit make()
oder nicht? Oder wird nur eine Zeigerkopie auf die ursprüngliche Zeichenfolge zurückgegeben.
Warum sollten Sie 20 Bytes zuweisen, anstatt die tatsächlich benötigte Anzahl an Bytes für die Zeichenkette anzugeben? Wenn die Zeichenfolge weniger als 20 benötigt, ist das nicht etwas ineffizient? Und auch fehleranfällig, wenn sie 20 überschreitet?
@Sir: Wir weisen keine 20 Bytes zu. Wir kopieren 3 Bytes, die Länge von s
Die Funktion "Kopieren" ist nicht stumm. Anhängen an und Kopieren von Slices : "Die Anzahl der kopierten Elemente ist das Minimum von len(src) und len(dst)."
Das scheint keine Antwort auf die Frage zu sein. OP wollte die Bytes der Zeichenkette in ein bestehendes Array schreiben, das länger als die Zeichenkette sein könnte.
Ich denke, es ist besser
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
Sehen Sie hier nach: http://play.golang.org/p/vpnAWHZZk7
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
12 Stimmen
Wenn die Länge der
str
größer ist als die Länge vonarr
dann erhalten Sie die Fehlermeldung "Index außerhalb des Bereichs".1 Stimmen
[]byte(“abc”)
um eine Zeichenkette in ein Byte-Slice zu setzen. Siehe stackoverflow.com/a/62740786/12817546 .string(b)
oder einefmt.Sprintf("%s", b)
um einen Byteslice auf einen Stich zu setzen. Siehe stackoverflow.com/a/62725637/12817546 .