Tutorial

Знакомство с пакетом Strings в Go

Published on January 24, 2020
Русский
Знакомство с пакетом Strings в Go

Введение

Пакет strings в Go позволяет использовать ряд функций для работы со строковым типом данных. Эти функции позволяют нам легко изменять строки и совершать с ними другие манипуляции. Функции можно сравнить с определенными действиями, которые мы совершаем с элементами нашего кода. Встроенные функции — это функции, которые определены в языке программирования Go и доступны для использования без каких-либо сложностей.

В этом обучающем руководстве мы рассмотрим несколько различных функций, которые мы можем использовать для работы со строками в Go.

Перевод строк в верхний и нижний регистр

Функции strings.ToUpper и strings.ToLower будут возвращать строку со всеми символами оригинальной строки, переведенными в верхний или нижний регистр. Поскольку строки — это неизменяемый тип данных, возвращенная строка будет представлять собой новую строку. Любые символы в строке, которые не являются буквам, останутся неизменными.

Для преобразования строки "Sammy Shark"в верхний регистр, используйте функцию strings.ToUpper:

ss := "Sammy Shark"
fmt.Println(strings.ToUpper(ss))
Output
SAMMY SHARK

Для преобразования строки в нижний регистр используйте следующий код:

fmt.Println(strings.ToLower(ss))
Output
sammy shark

Поскольку вы используете пакет strings, вам нужно предварительно импортировать его в программу. Программа для преобразования строки в строку с символами в верхнем и нижнем регистре будет выглядеть следующим образом:

package main

import (
	"fmt"
	"strings"
)

func main() {
	ss := "Sammy Shark"
	fmt.Println(strings.ToUpper(ss))
	fmt.Println(strings.ToLower(ss))
}

Функции strings.ToUpper и strings.ToLower упрощают оценку и сравнение строк, обеспечивая единообразие их регистра. Например, если пользователь пишет свое имя в нижнем регистре, мы все равно сможем определить, содержится ли его имя в нашей базе данных, проверив версию строки в верхнем регистре.

Функции поиска строки

Пакет strings имеет ряд функций, которые помогают определить, содержит ли строка конкретную последовательность символов.

Функция Использование
strings.HasPrefix Поиск строки с начала
strings.HasSuffix Поиск строки с конца
strings.Contains Поиск в любом месте строки
strings.Count Счетчик количества появлений строки в тексте

Функции strings.HasPrefix и strings.HasSuffix позволяют проверить, начинается строка с определенного набора символов или заканчивается ли строка определенным набором символов.

Например, чтобы проверить, начинается ли строка "Sammy Shark" с Sammy и заканчивается ли она словом Shark:

ss := "Sammy Shark"
fmt.Println(strings.HasPrefix(ss, "Sammy"))
fmt.Println(strings.HasSuffix(ss, "Shark"))
Output
true true

Вы можете использовать функцию strings.Contains для проверки того, содержит ли строка "Sammy Shark" последовательность символов Sh:

fmt.Println(strings.Contains(ss, "Sh"))
Output
true

Наконец, чтобы узнать, сколько раз символ S появляется в выражении Sammy Shark:

fmt.Println(strings.Count(ss, "S"))
Output
2

Примечание. Все строки в Go чувствительны к регистру. Это означает, что строка Sammy не аналогична строке sammy.

Использование символа s в нижнем регистре для подсчета количества появлений в строке Sammy Shark не дает тот же результат, что и использование символа S в верхнем регистре:

fmt.Println(strings.Count(ss, "s"))
Output
0

Так как S отличается от s, функция будет возвращать значение 0.

Функции для работы со строками оказываются полезны, когда вы хотите сопоставить строки или выполнить поиск строк в вашей программе.

Определение длины строки

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

Для демонстрации работы этой функции мы определим длину строки, которая содержит целое предложение:

import (
	"fmt"
	"strings"
)

func main() {
        openSource := "Sammy contributes to open source."
        fmt.Println(len(openSource))
}
Output
33

Мы задали переменную OpenSource, которая соответствует строке "Sammy contributes to open source.", а затем передали эту переменную в функцию len() с помощью конструкции len(openSource). В конечном итоге мы передали вывод нашей функции в функцию fmt.Println(), чтобы увидеть результат выполнения программы на экране.

Необходимо учитывать, что функция len() будет считать любые символы, которые содержатся внутри двойных кавычек, включая буквы, числа, символы пробела и специальные символы.

Функции для манипуляций со строками

Функции strings.Join, strings.Split и strings.ReplaceAll предоставляют ряд дополнительных методов манипуляций со строками в Go.

Функция strings.Join полезна для объединения набора строк в новую единую строку.

Для создания разделенной запятой строки из набора строк мы будем использовать эту функцию следующим образом:

fmt.Println(strings.Join([]string{"sharks", "crustaceans", "plankton"}, ","))
Output
sharks,crustaceans,plankton

Если мы хотим добавлять запятую и пробел между значениями строк в нашей новой строке, мы можем просто перезаписать наше выражение с пробелом после запятой: strings.Join([]string{"sharks", "crustaceans", "plankton"}, ", ")​​.

Так же, как мы можем объединять строки, мы можем и разбивать строки на несколько отдельных строк. Для этого мы можем использовать функцию strings.Split и выполнить разделение строки по пробелам:

balloon := "Sammy has a balloon."
s := strings.Split(balloon, " ")
fmt.Println(s)
Output
[Sammy has a balloon]

В результате мы получим набор строк. Поскольку мы использовали strings.Println, очень трудно сказать, какой мы получили результат, посмотрев на вывод. Чтобы убедиться, что мы получили набор строк, используйте функцию fmt.Printf с оператором %q, чтобы вывести строки:

fmt.Printf("%q", s)
Output
["Sammy" "has" "a" "balloon."]

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

data := "  username password     email  date"
fields := strings.Fields(data)
fmt.Printf("%q", fields)
Output
["username" "password" "email" "date"]

Функция strings.ReplaceAll получает оригинальную строку и возвращает обновленную строку с определенными изменениями.

Давайте представим, что Sammy потерял свой шарик. Поскольку у Sammy больше нет шарика, мы изменим подстроку "has" (есть) оригинальной строки ballon на "had" (был) в новой строке:

fmt.Println(strings.ReplaceAll(balloon, "has", "had"))

В скобках первым параметром указан balloon, переменная, которая хранит оригинальную строку; далее идет подстрока "has", которую мы хотим заменить, а третьим параметром идет "had", подстрока, которую мы хотим вставить в оригинальную строку. Наш вывод будет выглядеть следующим образом, когда мы добавим этот код в программу:

Output
Sammy had a balloon.

Использование функций strings.Join, strings.Split и strings.ReplaceAll позволяет получить дополнительные возможности для манипуляций со строками в Go.

Заключение

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

Дополнительную информацию о других типах данных вы можете получить в статье Знакомство с типами данных, а узнать больше о строках можно из руководства Начало работы со строками.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors


Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
1 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Указанный автором способ определения длинны строки будет верным только в случае использования ASCII символов в строке. Функция len вернет не количество символов, а количество байт. Для строки в юникоде (например 世界) len(“世界”) не будет соответствовать количеству рун в строке. Более универсальным будет использование пакета “unicode/utf8”: package main

import “fmt” import “unicode/utf8”

func main() { fmt.Println(“Hello, 世界”, len(“世界”), utf8.RuneCountInString(“世界”)) }

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Featured on Community

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more