Строки, байты и руны — просто изучаем Go

Go
Строки, байты и руны — просто изучаем Go

Строки в Go заслуживают особого внимания и реализованы иначе, чем в других языках.

нить

В Go используйте двойные кавычки""Строка объявления:

s := "Hello world"
fmt.Println("len(s):",len(s))
fmt.Println(s);       

вывод:

len(s): 11
Hello world

Приведенный выше код объявляет строкуs,lenфункция возвращает строкуsбайт (включая пробелы).В Go строки на самом деле являются фрагментами байтов, доступными только для чтения..

s := "Hello world"
for i:=0;i<len(s);i++ {
	fmt.Print(s[i]," ")
}

Как вы думаете, что выведет приведенный выше код, это буква? Вообще-то нет:

72 101 108 108 111 32 119 111 114 108 100

Вывод состоит в том, что каждая буква находится вТаблица кодов ASCIIСоответствующее десятичное число выше. Как мы все знаем, язык Go используетUTF-8кодировка, которая аналогичнаASCIIкодировка совместима, ноASCIIкодирование занимает всего 1 байт, аUTF-8Для представления символа требуется 1-4 байта.

s := "Hello world"
for i:=0;i<len(s) ;i++  {
	fmt.Printf("%c ",s[i])
}
fmt.Println("")
for i:=0;i<len(s) ;i++  {
	fmt.Printf("%v ",s[i])      
}
fmt.Println("")
for i:=0;i<len(s) ;i++  {
	fmt.Printf("%x ",s[i])    
}
fmt.Println("")
for i:=0;i<len(s) ;i++  {
	fmt.Printf("%T ",s[i])
}

выход:

H e l l o   w o r l d 
72 101 108 108 111 32 119 111 114 108 100 
48 65 6c 6c 6f 20 77 6f 72 6c 64 
uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 uint8 

Вышеприведенный код,%vотформатировать десятичное значение, соответствующее выходному байту;%xвывод в шестнадцатеричном формате;%TТип форматированного выходного значения. Как видно из результатов, типы значенийuint8которыйbyteТипы,byteдаuint8псевдоним,byteвведите мойстатьявведено в. Давайте взглянем:Строка, содержащая не-ASCIIкодовый символКакая будет ситуация.

s := "Hellõ World"
fmt.Println("len(s):", len(s))
for i := 0; i < len(s); i++ {
	fmt.Printf("%c ", s[i])
}
fmt.Println("")
for i := 0; i < len(s); i++ {
	fmt.Printf("%v ", s[i])
}
fmt.Println("")
for i := 0; i < len(s); i++ {
	fmt.Printf("%x ", s[i])
}

выход:

len(s): 12
H e l l à µ   W o r l d 
72 101 108 108 195 181 32 87 111 114 108 100 
48 65 6c 6c c3 b5 20 57 6f 72 6c 64

В приведенном выше примереoзаменитьõ. Как видно из результатов, длина строки равна 12 байтам, что указывает на то, чтоõЗанимает два байта. тем не мениеõРезультат становитсяà µ,õизUnicodeКодовая точкаU+00F5,ЭтоКодировка UTF-8два байтаc3,b5.forЦикл читает байт за байтом,c3(195 десятичный) соответствующий символÃ,b5(181 десятичный) соответствующий символµ(посмотреть здесь). знакомыйASCII,UTF-8а такжеUnicodeЭто больше способствует пониманию этих знаний.Об этих знаниях я не буду вдаваться в подробности в этой статье.Если вам интересно, вы можете обратиться к ней.здесь.UTF-8В кодировании кодовая точка занимает как минимум один байт.Если мы все еще используем кодовую точку, чтобы занять байт для печати символов, возникнут проблемы, как в приведенном выше примере. Есть ли способ решить эту проблему, к счастью, Go предоставляет намrune.

Rune

runeэто встроенный тип данных Go, даint32Псевдоним для GoUnicodeкодовая точка. использоватьruneтип данных, разработчику не нужно заботиться о том, сколько байтов занимает кодовая точка.

s := "Hellõ World"
r := []rune(s)

fmt.Println("len(r):", len(r))
for i := 0; i < len(r); i++ {
	fmt.Printf("%c ", r[i])
}
fmt.Println("")
for i := 0; i < len(r); i++ {
	fmt.Printf("%v ", r[i])
}
fmt.Println("")
for i := 0; i < len(r); i++ {
	fmt.Printf("%x ", r[i])
}
fmt.Println("")
for i := 0; i < len(r); i++ {
	fmt.Printf("%T ", r[i])
}

выход:

len(r): 11
H e l l õ   W o r l d 
72 101 108 108 245 32 87 111 114 108 100 
48 65 6c 6c f5 20 57 6f 72 6c 64 
int32 int32 int32 int32 int32 int32 int32 int32 int32 int32 int32 

код выше, строкаsПреобразовывается по типу вruneломтик.õизUnicodeКодовая точкаU+00F5, что соответствует 245 в десятичном виде,обратитесь к этому. кусочекrДлина: 11; выводint32, доказаноruneдаint32псевдоним.

for rangeнить

Вышеупомянутый пример решил проблему раньше, есть лучший способ -range string. использоватьrangeцикл по строке, которая будет возвращатьсяruneИндексы символов и байтов типа.

s := "HellõWorld"
for index, char := range s {
	fmt.Printf("%c starts at byte index %d \n", char,index)
}

выход:

H starts at byte index 0 
e starts at byte index 1 
l starts at byte index 2 
l starts at byte index 3 
õ starts at byte index 4 
W starts at byte index 6 
o starts at byte index 7 
r starts at byte index 8 
l starts at byte index 9 
d starts at byte index 10

По результатам вывода видно, чтоõЗанимает два байта: индексы 4 и 5.

После прочтения этой статьи у вас может возникнуть вопрос, как получить длину строки?

Length of the string

можно использоватьRuneCountInString()Прототип функции выглядит так:

func RuneCountInString(s string) (n int)

возвращаемая строкаruneколичество символов.

s := "Hellõ 中国"
length := utf8.RuneCountInString(s)
fmt.Println(length)

выход: 8

Строки неизменяемы

Ранее мы говорили, что строки — это фрагменты байтов, доступные только для чтения, которые после создания уже нельзя изменить. Если вы форсируете модификацию, будет сообщено об ошибке:

s := "Hello World"
s[0] = "h"

Ошибка:cannot assign to s[0]

В этой статье есть несколько сравнений.важный:

  1. Строки — это фрагменты байтов, доступные только для чтения;
  2. runeПредставляет в GoUnicodeкодовая точка;
  3. Перейти принимаетUTF-8кодировка, эта кодировкаUnicodeОдин из способов его достижения;
  4. знакомыйASCII,UTF-8а такжеUnicode, вы можете обратиться кЭтот, что больше способствует пониманию этой статьи;

Надеюсь, эта статья решит вашу проблемуGo stringЕсли у вас есть какие-либо вопросы, вы можете оставить сообщение для обсуждения!


(Конец полного текста)

Оригинал статьи, если нужно перепечатать, указывайте источник!
Добро пожаловать, чтобы отсканировать код и подписаться на официальный аккаунт »Голанг здесь” или двигатьсяseekload.net, см. больше замечательных статей.

Публичная учетная запись «Голанг идет» подготовила для вас подарочный пакет для изучения тайны, и ответьте на [электронную книгу] в фоновом режиме, чтобы получить его!

公众号二维码