Jump to content

Вольный перевод официальной статьи: Как писать Go код.


Recommended Posts

Статья:

Как писать Go код. (оригинал тут)

Вступление.

Этот документ демонстрирует разработку простого пакета Go внутри модуля и представляет инструмент go tool , стандартный способ извлечения(fetch), сборки(build) и установки(install) модулей, пакетов и команд Go.

Примечание:  В этом документе предполагается, что вы используете Go 1.13 или более позднюю версию, а переменная среды GO111MODULE не задана. Если вы ищете более старую версию этого документа, предназначенную для модулей, то она находится здесь.

GO111MODULE можно узнать так:

image.png.f468c3512fc08ac0176133b10048f3c3.png

 

Организация кода.

Программы Go организованы в пакеты. Пакет - это набор исходных файлов в одном каталоге, которые скомпилированы вместе. Функции, типы, переменные и константы, определенные в одном исходном файле, видны всем другим исходным файлам в том же пакете.

Репозиторий содержит один или несколько модулей. Модуль представляет собой набор связанных пакетов Go, которые выпускаются вместе. Хранилище Go обычно содержит только один модуль, расположенный в корне хранилища.Файл с именем go.mod объявляет путь к модулю: префикс пути импорта для всех пакетов в модуле.Модуль содержит пакеты в каталоге, содержащем его файл go.mod, а также подкаталоги этого каталога, вплоть до следующего подкаталога, содержащего другой файл go.mod (если есть).

Обратите внимание, что вам не нужно публиковать свой код в удаленном хранилище, прежде чем вы сможете его собрать. Модуль может быть определен локально, без принадлежности к хранилищу.Тем не менее, это хорошая привычка организовывать ваш код так, как будто вы когда-нибудь опубликуете его.

Путь каждого модуля не только служит префиксом пути импорта для его пакетов, но также указывает, где команда go должна искать его для загрузки.Например, чтобы загрузить модуль golang.org/x/tools, команда go будет обращаться к хранилищу, указанному в https://golang.org/x/tools (подробнее описано здесь).

import path(Путь импорта) - это строка, используемая для импорта пакета. Путь импорта пакетов - это пути к модулю, объединенный с его подкаталогом в модуле. Например, модуль github.com/google/go-cmp содержит пакет в каталоге cmp/. Путь импорта этого пакета - github.com/google/go-cmp/cmp. Пакеты в стандартной библиотеке не имеют префикса пути модуля.

Link to post
Share on other sites
  • 2 months later...

Ваша первая программа

Чтобы скомпилировать и запустить простую программу, сначала выберите путь к модулю (мы будем использовать example.com/user/hello) и создайте файл go.mod, который объявит его:

$ mkdir hello # Alternatively, clone it if it already exists in version control.
$ cd hello
$ go mod init example.com/user/hello
go: creating new go.mod: module example.com/user/hello
$ cat go.mod
module example.com/user/hello

go 1.14
$

Первый оператор в исходном файле Go должен быть именем пакета. Исполняемые команды всегда должны использовать пакет main. Затем создайте файл с именем hello.go внутри этого каталога, содержащий следующий код Go:

package main

import "fmt"

func main() {
	fmt.Println("Hello, world.")
}

Теперь вы можете собрать и установить эту программу с помощью инструмента go:

$ go install example.com/user/hello
$

Эта команда создает команду hello, создавая исполняемый двоичный файл. Затем он устанавливает этот двоичный файл как $ HOME/go/bin/hello (или, в Windows,% USERPROFILE%\go\bin\hello.exe).

Вы можете использовать команду go env для переносного задания значения по умолчанию для переменной среды для будущих команд go:

$ go env -w GOBIN=/somewhere/else/bin
$

Чтобы сбросить переменную, ранее установленную с помощью go env -w, используйте go env -u:

$ go env -u GOBIN
$

Команды, такие как go install, применяются в контексте модуля, содержащего текущий рабочий каталог. Если рабочий каталог не находится в модуле example.com/user/hello, может произойти сбой установки go. Для удобства команды go принимают пути относительно рабочего каталога и по умолчанию используют пакет в текущем рабочем каталоге, если другой путь не указан. Итак, в нашем рабочем каталоге все следующие команды эквивалентны:

$ go install example.com/user/hello
$ go install .
$ go install

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

# Windows users should consult https://github.com/golang/go/wiki/SettingGOPATH
# for setting %PATH%.
$ export PATH=$PATH:$(dirname $(go list -f '{{.Target}}' .))
$ hello
Hello, world.
$

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

$ git init
Initialized empty Git repository in /home/user/hello/.git/
$ git add go.mod hello.go
$ git commit -m "initial commit"
[master (root-commit) 0b4507d] initial commit
 1 file changed, 7 insertion(+)
 create mode 100644 go.mod hello.go
$

Команда go находит хранилище, содержащее заданный путь к модулю, запрашивая соответствующий HTTPS-URL и читая метаданные, встроенные в HTML-ответ (см. Go help importpath). Многие хостинговые сервисы уже предоставляют эти метаданные для репозиториев, содержащих код Go, поэтому самый простой способ сделать ваш модуль доступным для использования другими - это обычно сделать так, чтобы его путь к модулю соответствовал URL-адресу для хранилища.

Link to post
Share on other sites
  • 1 month later...

Импорт пакетов из вашего модуля

Напишем пакет morestrings и воспользуемся им из программы hello. Сначала создайте каталог для пакета с именем $HOME/hello/morestring, а затем файл с именем reverse.go в этом каталоге со следующим содержимым:

// Package morestrings implements additional functions to manipulate UTF-8
// encoded strings, beyond what is provided in the standard "strings" package.
package morestrings

// ReverseRunes returns its argument string reversed rune-wise left to right.
func ReverseRunes(s string) string {
	r := []rune(s)
	for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
		r[i], r[j] = r[j], r[i]
	}
	return string(r)
}

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

Давайте проверим, что пакет компилируется с помощью go build:

$ cd $HOME/hello/morestrings
$ go build
$

Это не создаст выходной файл. Вместо этого он сохраняет скомпилированный пакет в локальном кэше сборки.

Убедившись, что пакет morestrings строится, давайте воспользуемся им из программы hello. Для этого измените исходный $HOME/hello/hello.go, чтобы использовать пакет morestrings:

package main

import (
	"fmt"
	"example.com/user/hello/morestrings"
)

func main() {
	fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
}

Установите программу hello:

$ go install example.com/user/hello

Запустив новую версию программы, вы должны увидеть новое обратное сообщение:

$ hello
Hello, Go!

 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...