Jak uzyskać wynik „E” zamiast 69?
package main
import "fmt"
func main() {
fmt.Print("HELLO"[1])
}
Czy Golang ma funkcję konwersji znaku na bajt i odwrotnie?
Jak uzyskać wynik „E” zamiast 69?
package main
import "fmt"
func main() {
fmt.Print("HELLO"[1])
}
Czy Golang ma funkcję konwersji znaku na bajt i odwrotnie?
Odpowiedzi:
Zinterpretowane literały łańcuchowe to sekwencje znaków w podwójnych cudzysłowach "" przy użyciu (być może wielobajtowego) kodowania UTF-8 poszczególnych znaków. W UTF-8 znaki ASCII są jednobajtowe, odpowiadające pierwszym 128 znakom Unicode. Łańcuchy zachowują się jak fragmenty bajtów. Runa to liczba całkowita identyfikująca punkt kodowy Unicode. W związku z tym,
package main
import "fmt"
func main() {
fmt.Println(string("Hello"[1])) // ASCII only
fmt.Println(string([]rune("Hello, 世界")[1])) // UTF-8
fmt.Println(string([]rune("Hello, 世界")[8])) // UTF-8
}
Wynik:
e
e
界
Czytać:
Przejdź do sekcji Specyfikacja języka programowania na temat konwersji .
A co powiesz na to ?
fmt.Printf("%c","HELLO"[1])
Jak wskazuje Peter, aby pozwolić na coś więcej niż tylko ASCII:
fmt.Printf("%c", []rune("HELLO")[1])
Można to zrobić również poprzez krojenie
package main
import "fmt"
func main() {
fmt.Print("HELLO"[1:2])
}
UWAGA: To rozwiązanie działa tylko w przypadku znaków ASCII.
Go tak naprawdę nie ma typu postaci jako takiego. bajt jest często używany do znaków ASCII, a runa do znaków Unicode, ale oba są tylko aliasami dla typów całkowitych (uint8 i int32). Więc jeśli chcesz wymusić, aby były drukowane jako znaki zamiast liczb, musisz użyć Printf("%c", x)
. Specyfikacja %c
formatu działa dla każdego typu liczby całkowitej.
Możesz także spróbować typecastingu za pomocą łańcucha.
package main
import "fmt"
func main() {
fmt.Println(string("Hello"[1]))
}
Ogólnym rozwiązaniem interpretacji znaku jako łańcucha jest string("HELLO"[1])
.
Oczywiście rozwiązanie Richa również działa.
Inne rozwiązanie, aby wyodrębnić znak w ciągu
package main
import "fmt"
func main() {
var word string = "ZbjTS"
// P R I N T
fmt.Println(word)
yo := string([]rune(word)[0])
fmt.Println(yo)
//I N D E X
x :=0
for x < len(word){
yo := string([]rune(word)[x])
fmt.Println(yo)
x+=1
}
}
także dla tablic ciągów:
fmt.Println(string([]rune(sArray[0])[0]))
// = linia z komentarzem
len("cafés")
> len([]rune("cafés"))
i może przestawienia ciąg na każdej iteracji dla, O (n²). Wystarczy zrobić for _, r := range word { fmt.Printf("%c", r) }
. Jeśli naprawdę chciał pętli z indeksem for x := 0; x < limit; x++
. Proszę nauczyć się podstaw języka przed odebraniem pytania
"हैलो"[:1]
to daje