Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Case списокВыражений1: блок1





...

Case списокВыраженийN: блокN

Default: блокD

}

Точка с запятой обязательна при наличии необязательной инструкции, независимо от наличия необязательного выражения. Каждый блок состоит из нуля или более инструкций.

Если в инструкции switch отсутствует необязательное выражение, компилятор предполагает, что в качестве выражения используется значение true. Необязательная инструкция должна быть простой.

Если в необязательной инструкции объявляются переменные (например, с помощью оператора:=), их область видимости простирается от точки объявления до конца всей инструкции switch, то есть они существуют во всех блоках case и в блоке default и прекращают свое существование в конце инструкции switch.

Наибольшая эффективность инструкции switch достигается, когда инструкции case упорядочены сверху вниз от наиболее вероятных вариантов к наименее вероятным.

Раздел default является необязательным, но при его наличии он может находиться в любом месте внутри инструкции switch. Если не будет найдено совпадения ни с одним выражением в инструкциях case, будет выполнен блок default, если имеется. В противном случае управление будет передано инструкции, следующей за инструкцией switch.

В каждой инструкции case должен иметься список из одного или более выражений, разделенных запятыми, типы значений которых совпадают с типом значения необязательного выражения в инструкции switch. Если необязательное выражение отсутствует, компилятор по умолчанию использует значение true, то есть значение типа bool, и в этом случае все выражения во всех инструкциях case должны возвращать значение типа bool.

Если в блоке case или default будет встречена инструкция break, инструкция switch немедленно прервет выполнение и передаст управление следующей за ней инструкции или, если в инструкции break указано имя метки, ближайшей вмещающей инструкции for, switch или select, где определена указанная метка.

Ниже приводится простой пример инструкции switch, не имеющей необязательной инструкции и необязательного выражения.

func BoundedInt(minimum, value, maximum int) int {

switch {

case value < minimum:

Return minimum

case value > maximum:

Return maximum

}

Return value

}

Поскольку здесь нет необязательного выражения, вместо него компилятор будет использовать значение true. То есть все выражения во всех инструкциях case должны возвращать значение типа bool. Здесь оба выражения используют логические операторы сравнения.

switch {

case value < minimum:

Return minimum

case value > maximum:

Return maximum

default:

Return value

}

panic("Недоступно")

Выше приводится альтернативная реализация тела функции BoundedInt(). Инструкция switch теперь охватывает все возможные случаи, поэтому поток выполнения никогда не достигнет конца функции. Тем не менее компилятор Go требует, чтобы функция завершалась инструкцией return или вызовом функции panic(), поэтому здесь использована последняя, чтобы лучше выразить семантику функции.

Задание2.3 Необходимо вывести название времени года по введенному номеру текущего месяца:

switch m {

case 12:

Fallthrough

case 1:

Fallthrough

case 2:

fmt.Println("Зима")

case 3:

Fallthrough

case 4:

Fallthrough

case 5:

fmt.Println("Весна")

case 6:

Fallthrough

case 7:

Fallthrough

case 8:

fmt.Println("Лето")

case 9:

Fallthrough

case 10:

Fallthrough

case 11:

fmt.Println("Осень")

default:

fmt.Println("Неправильный ввод")

}

Эта инструкция switch имеет необязательное выражение m. В данном случае значение выражения имеет тип int, поэтому все выражения во всех инструкциях case должны содержать одно или более целых чисел, разделенных запятыми, для сопоставления. Здесь также использована инструкция fallthrough, чтобы обеспечить обработку всех месяцев выводом одной и той же строки.

Задание 2.4 Воспользуемся для получения текущего месяца функцией Now().Month() пакета time, Now() - возвращает текущую дату и время, а Month() - возвращает значение месяца типа Month:

Type Month int

Const (

January Month = 1 + iota

February

March

April

May

June

July

August

September

October

November

December

)

Приведем инструкцию switch к канонической форме:

switch mon {

case 12, 1, 2:

fmt.Println("Зима")

case 3, 4, 5:

fmt.Println("Весна")

case 6, 7, 8:

fmt.Println("Лето")

case 9, 10, 11:

fmt.Println("Осень")

}

Здесь приводится более компактная и каноническая версия предыдущей инструкции switch. Вместо инструкций fallthrough в одну инструкцию case был помещен список всех номеров месяцев, перечисленных через запятую.

Задание 2.5 Разработайте приложение, которое по дню недели определяет какой это день: рабочий или выходной (воспользуйтесь функцией Weekday() пакета time).

Инструкция цикла for

В языке Go имеются две разновидности инструкции for, простая инструкция for и for... range. Синтаксис простой инструкции:

for необязатПредИнструкция;логичВыражение; необязатПостИнструкция {

Блок

}

Фигурные скобки являются обязательными, а точки с запятой необходимы только в случае использования пред- и постинструкций, которые должны быть простыми инструкциями. Если в необязательной инструкции объявляются переменные или сохраняются значения, возвращаемые ключевым словом range (например, с помощью оператора:=), их область видимости простирается от точки объявления до конца всей инструкции for.

Логическое выражение в простой инструкции for должно возвращать значение типа bool, потому что в языке Go не выполняется автоматическое преобразование нелогических значений. Частные случаи инструкции for:

for { // Бесконечный цикл

Блок

}

for логическоеВыражение { // Цикл while

Блок

}

Вторая разновидность инструкции for...range итераций по строкам возвращает индексы байтов.

for индекс, символ:= range Строка { // Итерации по символам в Строке

Блок

}

Вторая разновидность инструкции for...range итераций по массивам или срезам для непустых срезов или массивов возвращает индексы элементов от 0 до len(срез) - 1.

for index:= range массивИлиСрез { // Итерации по массиву или срезу

блок // item:= массивИлиСрез[index]

}

Еще одна разновидность инструкции for range итераций по массивам и срезам

for индекс, элемент:= range массивИлиСрез { // Итерации по массиву или срезу

Блок

}

Инструкции for...range итераций по элементам ключ/значение и по ключам отображений возвращают элементы или ключи в произвольном порядке.

for ключ, значение:= range Отображение { // Итерации по элементам отображения

Блок

}

for ключ:= range Отображение { // Итерации по элементам отображения

блок // значение:= Отображение[ключ]

}

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

Если какая-либо из форм будет применена к пустой строке, массиву, срезу или отображению, тело цикла for просто не будет выполнено ни разу, и управление сразу перейдет к следующей инструкции.

Выполнение цикла for можно прервать в любой момент с помощью инструкции break, передающей управление инструкции, следующей за инструкцией for, или, если в инструкции break указана метка, ближайшей вмещающей инструкции for, switch или select, где определена эта метка. Имеется также возможность с помощью инструкции continue передать управление в начало инструкции for, условному выражению или ключевому слову range, чтобы принудительно запустить следующую итерацию (или завершить цикл).

Задание 2.6 Определить, количество простых чисел в одномерном массиве.

var a [10] int //описываем массив из 10 целых чисел

for i:= range a { // заполнение массива случайными значениями от 1 до 99

a[i] = r.Intn(99) + 1

fmt.Printf("%d ", a[i])

}

fmt.Print("\n")

count:= 0 // количество составных чисел в массиве

for i:= range a {

METKA:

for j:= 2; j < a[i]; j++ {

if a[i]%j == 0 {

count++

Break METKA

}

}

}

fmt.Printf("Количество простых чисел в массиве: %d ", 10-count)

Метка – это идентификатор, за которым следует двоеточие. При обнаружении искомого значения (делителя) выполняется прерывание внутреннего цикла с переходом в начало внешнего цикла за счет использования инструкции break с меткой. Преимущества использования приема прерывания цикла с переходом по метке возрастают многократно, когда он применяется в серии глубоко вложенных циклов.

Метки могут применяться к циклам for, инструкциям switch и select. Обе инструкции, break и continue, позволяют указывать метки и могут использоваться внутри циклов for. Инструкции break, с метками или без них, можно также использовать внутри инструкций switch и select.

Метки могут играть роль самостоятельных инструкций, и в этом случае их можно использовать в инструкциях безусловного перехода goto (например: goto label). Один из случаев применения инструкции goto – автоматическая генерация программного кода.

Задание 2.7 Разработать приложение, которое позволяет подсчитать количество повторяющихся строк в файле (файлах), имена файлов передаются как аргументы командой строки. Программа должна выводить строку и количество ее повторений.

counts:= make(map[string]int) /*Отображение (map) содержит набор пар «ключ-значение» и обеспечивает константное время выполнения операций хранения, извлечения или проверки наличия элемента в множестве. Ключ может быть такого типа, значения которого можно сравнить с помощью оператора = =; распространенным примером ключа являются строки. Значение может быть любого типа. В нашем примере ключи представляют собой строки, а значения представлены типом int. Встроенная функция make создает новое пустое отображение*/

for _, fname:= range os.Args[1:] {

data, err:= ioutil.ReadFile(fname) /* Функция ReadFile (пакет io/ioutil) возвращает байтовый срез, который должен быть преобразован в string так, чтобы его можно было разбить с помощью функции strings.Split (пакет strings)*/

if err!= nil { // вывод возможной ошибки при чтении данных из файла

fmt.Fprintf(os.Stderr, "dup2: %v\n", err)

Continue

}

/*Данные, прочитанные из файла, разбиваем на строки и считаем повторения. Когда новая строка встречается впервые, выражение counts [line] присваивает нулевое значение новому элементу, которое для типа int равно 0*/

for _, line:= range strings.Split(string(data), "\n") {

counts[line]++

}

}

/* Для вывода результатов используем цикл по отображению counts. Каждая итерация дает две величины - ключ и значение элемента отображения для этого ключа. Порядок обхода отображения не определен, на практике этот порядок случаен и варьируется от одного выполнения программы к другому*/

for line, n:= range counts {

if n > 1 {

fmt.Printf("%s\t%d\n", line, n)

}

}

Функция fmt.Printf выполняет форматированный вывод на основе списка выражений. Первым ее аргументом является строка формата, которая указывает, как должны быть отформатированы последующие аргументы. Формат каждого аргумента определяется символом преобразования, буквой, следующей за знаком процента. Например, %d форматирует целочисленный операнд в десятичной записи, a %s выводит значение строкового операнда.

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

 

Таблица 2.1 - Некоторые преобразования функции Printf

Глагол Описание
%d Десятичное целое
%х, %о, %b Целое в шестнадцатеричном, восьмеричном и двоичном представлениях
%f, %g, %е Числа с плавающей точкой: 3.141593 3.141592653589793 3.141593e+00
%t Булево значение: true или false
Руна (символ Unicode)
%s Строка
%q Выводит в кавычках строку типа "abc" или символ типа ' с '
%v Любое значение в естественном формате
%T Тип любого значения
%% Символ процента

 

Рассмотрим пример создания простого HTTP-сервера.

Задание 2.8 Создайте веб-приложение, предлагающее пользователю вводить числа и выполнять простейшие вычисления.

Для реализации простого HTTP-сервера необходимо сделать следующее:

1 Определить строковые константы:

pageTop = `<!DOCTYPE HTML><html><head>

<style>.error{color:#FF0000;}</style></head><title>Калькулятор</title>

<body><h3>Арифметические операции</h3>

<p>Выполнение некоторых арифметических операций</p>`

form = `<form action="/" method="POST">

<label for="number1">Введите первое число:</label><br />

<input type="text" name="a" size="10"><br />

<label for="number2">Введите второе число:</label><br />

<input type="text" name="b" size="10"><br />

<input type="submit" value="Выполнить">

</form>`

pageBottom = `</body></html>`

error = `<p class="error">%s</p>`

2 В функцию main добавить строки:

func main() {

http.HandleFunc("/", homePage) /* Функция http.HandleFunc() принимает два аргумента: путь и ссылку на функцию, которую следует вызвать при поступлении запроса по указанному пути. Функция должна иметь сигнатуру func(http.ResponseWriter, *http.Request). Приложение может зарегистрировать неограниченное количество пар путь/функция. Здесь регистрируются путь / (то есть домашняя страница веб-приложения) и пользовательская функция homePage()*/

if err:= http.ListenAndServe(":9001", nil); err!= nil { /* Функция http.ListenAndServe() запускает веб-сервер, принимающий запросы на указанном сетевом TCP-адресе, – здесь используется локальный адрес компьютера и порт с номером 9001. Когда указывается только номер порта, автоматически предполагается, что адрес соответствует локальному компьютеру, можно было использовать адрес "localhost:9001" или "127.0.0.1:9001". Номер порта для данного приложения был выбран совершенно произвольно, вместо него можно указать другой, если использование этого номера вызывает конфликты с существующим сервером. Второй аргумент определяет тип сервера. Обычно в нем передается nil, чтобы выбрать тип по умолчанию*/

log.Fatal("Не удалось запустить сервер", err)

}

}

3 Написать функцию homePage():

/*Эта функция вызывается при каждом посещении веб-сайта приложения. В аргументе writer передается значение, куда должен записываться ответ (в формате HTML), а в аргументе request – подробная информация о запросе*/

func homePage(writer http.ResponseWriter, request *http.Request) {

err:= request.ParseForm() // Должна вызываться перед записью в ответ

/*Функция начинается с анализа формы (которая изначально имеет пустые текстовые элементы <input>). Текстовым элементам <input> присвоены имена «a» и «b», чтобы на них можно было ссылаться позднее, при обработке формы. Атрибуту action формы присвоено значение /, чтобы после щелчка на кнопке Выполнить браузер запрашивал ту же самую страницу. Это означает, что функция homePage() будет вызываться для обработки всех запросов, поэтому она должна уметь обрабатывать первичный вызов, когда еще не было введено ни одного числа, и последующие вызовы, когда числа были введены или когда возникла ошибка. Фактически вся работа выполняется функцией processRequest(), поэтому разные случаи обрабатываются этой функцией.

После анализа формы выводятся строковые константы pageTop и form. Если в ходе анализа обнаружится ошибка, также будет выведено сообщение об ошибке; anError – это строка формата, а err – значение ошибки для форматирования*/







Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)...

ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования...

Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...

Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычис­лить, когда этот...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.