Прогулка третья. По Пушкинским местам

Ну что, поэты, GOтовы? Будем изучать строки. В go не любят строки, поэтому урок будет коротким.

Тип данных

Для строк в go отведен специальный типа данных — string. И все бы ничего, но только string — это неизменяемые (immutable) строки. По сути string — это массив типа byte (он же int8). Так вот, однажды созданный этот массив не меняет своего содержимого никогда. К содержимому строк можно обращаться по индексам (как к элементам массива), но только читать. Поменять букву в строке нельзя:

var x string // объявили строку x
s := "hello" // можно: строка s со значением "hello"
if s[0] == 'h' .... // так можно проверять начинается ли строка с буквы "h"
s = "world" // можно присвоить переменной s другую строку 
s[1] = 'x' // а вот так - нельзя! Мы меняем содержимое строки 

Указатели

Да, в go есть указатели. Слезы радости вижу на лицах C-шников. Слезы горя вижу на лицах Java-писцев.
Компромисс найден. Указатели в go можно создавать и разыменовывать. Еще сравнивать. На примере числовых переменных:

var i, j int
var p *int
i = 3
p = &i
j = *p

Нельзя смещать (увеличивать, уменьшать) указатели. Да и вообще от всяких хакерских штучек в go решили отойти. Зачем вообще нужны указатели? Я думаю, об этом мы поговорим отдельно в следующих статьях. Пока воспринимайте как данность.

Так вот, на элементы строк тоже указывать нельзя:

s1 := "hello"
s2 := &s1[3] // Вот так не получится

Так зачем же нужны строки?!

Есть особый пакет — strings. В нем хранятся функции для работы со строками. Через них все и делается. Например:

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "Мой дядя самых честных правил"
	fmt.Printf("Original string: %s\n", s)

	/* Можно разбивать строку на слова по пробелам */
	words := strings.Fields(s)
	for i:=0; i<len(words); i++ { // len(x) - возвращает размер массива x. Подробнее - на след. прогулке
		fmt.Printf("  word #%d: %s\n", i, words[i])
	}

	/* Можно искать индекс вхождения подстроки в строку */
	leftIndex := strings.Index(s, "дя")
	rightIndex := strings.LastIndex(s, "дя")
	fmt.Printf("index of 'дя' is %d/%d\n", leftIndex, rightIndex)

	/* Можно заменять участки строки на другую строку*/
	repl := strings.Replace(s, "дя", "па", -1)
	fmt.Printf("After replace: %s\n", repl)
	/* Можно менять регистр букв на нижний, верхний и смешанный (первые буквы слов - заглавные) */
	fmt.Printf("%s\n%s\n%s", strings.ToLower(s),
	                         strings.Title(s),
	                         strings.ToUpper(s))
}

Остальные функции вы можете найти в описании пакета strings

Кодировки

Напоследок упомяну что go — юникодный язык. Все строки в нем изначально в UTF-8 (ну не зря же Роб Пайк его придумал). Специальные символы можно задавать как "\u1234" или "\xC3".
Также строки можно писать не только в двойных, но и в обратных кавычках (``). При этом строки в двойных кавычках называют интерпретируемыми (в них можно использовать \n, \t, \a и другие специальные последовательности), а в обратных — неинтерпретируемыми (raw strings). Например:
`hello\nworld` == «hello\\nworld»

Ну вот и все. To be Gontinued!


Домашнее задание

  • Подсчет гласных букв в строке
  • Подсчет слов в строке
  • Вывод слов строки в обратном порядке
    • Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s