Упоминаемый раньше конспект Go подчищен и подправлен по ходу работы с этой темой.
Можно его (в редакции 1.44) можно скачать здесь: конспект Go (обновление).
Модератор: Olej
Упоминаемый раньше конспект Go подчищен и подправлен по ходу работы с этой темой.
Язык программирования Go (torrent)
А архив примеров кодов (достаточно интересных) из книги - здесь: https://github.com/adonovan/gopl.io :Год издания: 2016
Автор: Алан А. А. Донован, Брайан У. Керниган
Переводчик: И. Красикова
Издательство: Вильямс
ISBN: 978-5-8459-2051-5, 978-0-13-419044-0
Код: Выделить всё
ch1 Update to gobook@27cf7b490526a0a0751ff12ed7cc4acd8afa2edc 6 years ago ch10 Update to gobook@c6d7a22edd03e7738c38d5baa2174ff325d8d863 6 years ago ch11 Update to gobook@4e7af548bbfd4df6c667221ed120f05a06591fdf 6 years ago ch12 Update to gobook@4fdc3c0a831c14c716c2c013e42268f6d21a9a13 6 years ago ch13 Update to gobook@4e7af548bbfd4df6c667221ed120f05a06591fdf 6 years ago ch2 ch2/popcount: show go1.7 SSA benchmarks 5 years ago ch3 Update to gobook@5e58e0a92b96bee61856a8ce6e75ed849bd504af 6 years ago ch4 Update to gobook@039ca5f7ddfb44bec546dbdc940c015d6e3912e6 6 years ago ch5 Update to gobook@c6d7a22edd03e7738c38d5baa2174ff325d8d863 6 years ago ch6 Update to gobook@4fdc3c0a831c14c716c2c013e42268f6d21a9a13 6 years ago ch7 Use *lexer.describe in parse error message 2 years ago ch8 Update to gobook@0a3e8d997823052c6a8575feca6e515ac6f8299d 6 years ago ch9 Update to gobook@fbe1ed9c21e6645482a25ac4debe81bab4c4fde2 5 years ago CNAME Create CNAME 2 years ago README.md remove warning about missing packages 6 years ago go.mod Add Go module 4 months ago go.sum Add Go module 4 months ago
Вполне стоит почитать:Решил попробовать сделать вольный перевод книги The Little Go Book от Karl Seguin. Эта книга бесплатна и распространяется под лицензиецией Attribution-NonCommercial-ShareAlike 4.0 International. Оригинал доступен на GitHub.
Содержание
Введение
Глава 1 – Основы
Глава 2 – Структуры
Глава 3 – Массивы, карты и срезы
Глава 4 – Организация кода и интерфейсы
Глава 5 – Лакомые кусочки
Глава 6 – Конкурентность
Заключение
Скачать книгу в формате ePub
Скачать книгу в формате MOBI
Это настолько интересная статья от автора Go, что я решил её перевести для быстрого всеобщего ознакомления. Предварительный (начерно ... ещё тёпленький, только из печи ) перевод - прилагаю.
Я составил список значительных упрощений в Go относительно C и C++:
• регулярный синтаксис (для разбора не нужна таблица символов);
• сборка мусора (исключительно);
• отсутствие заголовочных файлов;
• явные зависимости;
• отсутсвие циклических зависимостей;
• константы - это просто числа;
• int и int32 — это разные типы;
• регистр букв имён устанавливает видимость;
• методы для любого типа (без классов);
• без наследования подтипов (без подклассов);
• инициализация на уровне пакета и строго определенный порядок инициализации;
• файлы компилируемые вместе в пакет;
• глобальные переменные уровня пакета представлены в любом порядке;
• никаких арифметических преобразований (помогают константы);
• интерфейсы являются неявными (без объявления «реализует»);
• встраивание (без повышения до суперкласса);
• методы объявляются как функции (без специальной локализации);
• методы - это просто функции;
• интерфейсы - это просто методы (без данных);
• методы отождествляются только по имени (не по типу);
• без конструкторов и деструкторов;
• постинкремент и постдекремент - это операторы, а не выражения;
• нет преинкремента или преддекремента;
• присваивание не является выражением;
• определен порядок вычислений в присвоениях, функциональных вызовах (без «точек следования», известных из C/C++1);
• нет арифметики указателей;
• память всегда обнуляется;
• допустимо брать адрес локальной переменной;
• нет указателя this в методах;
• сегментированные стеки;
• нет const или других типов аннотаций;
• нет шаблонов;
• нет исключительных ситуаций;
• встроенный тип строк, срезы, ассоциативные хэши;
• проверка границ массива;
И поскольку философия Go, некоторыми своими существенными механизмами, отличается от традиционных более старых языков, то детализацию этих механизмов имеет смысл разбирать в отдельной теме... Таким же образом как созрела, а потом и была вынесена отдельно тема Go : параллельное выполнение.Olej писал(а): ↑12 фев 2022, 17:31Там Роб Пайк списком перечисляет те вещи, которые радикально отличают Go и от C и от C++:
Я составил список значительных упрощений в Go относительно C и C++:• регулярный синтаксис (для разбора не нужна таблица символов);
• сборка мусора (исключительно);
• отсутствие заголовочных файлов;
• явные зависимости;
• отсутсвие циклических зависимостей;
• константы - это просто числа;
• int и int32 — это разные типы;
• регистр букв имён устанавливает видимость;
• методы для любого типа (без классов);
• без наследования подтипов (без подклассов);
• инициализация на уровне пакета и строго определенный порядок инициализации;
• файлы компилируемые вместе в пакет;
• глобальные переменные уровня пакета представлены в любом порядке;
• никаких арифметических преобразований (помогают константы);
• интерфейсы являются неявными (без объявления «реализует»);
• встраивание (без повышения до суперкласса);
• методы объявляются как функции (без специальной локализации);
• методы - это просто функции;
• интерфейсы - это просто методы (без данных);
• методы отождествляются только по имени (не по типу);
• без конструкторов и деструкторов;
• постинкремент и постдекремент - это операторы, а не выражения;
• нет преинкремента или преддекремента;
• присваивание не является выражением;
• определен порядок вычислений в присвоениях, функциональных вызовах (без «точек следования», известных из C/C++1);
• нет арифметики указателей;
• память всегда обнуляется;
• допустимо брать адрес локальной переменной;
• нет указателя this в методах;
• сегментированные стеки;
• нет const или других типов аннотаций;
• нет шаблонов;
• нет исключительных ситуаций;
• встроенный тип строк, срезы, ассоциативные хэши;
• проверка границ массива;
Теперь возвращаясь к вопросам среды Go ...
Код: Выделить всё
olej@R420:~$ go help env
usage: go env [-json] [-u] [-w] [var ...]
Env prints Go environment information.
By default env prints information as a shell script
(on Windows, a batch file). If one or more variable
names is given as arguments, env prints the value of
each named variable on its own line.
The -json flag prints the environment in JSON format
instead of as a shell script.
The -u flag requires one or more arguments and unsets
the default setting for the named environment variables,
if one has been set with 'go env -w'.
The -w flag requires one or more arguments of the
form NAME=VALUE and changes the default settings
of the named environment variables to the given values.
For more about environment variables, see 'go help environment'.
Код: Выделить всё
olej@R420:~$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/olej/.cache/go-build"
GOENV="/home/olej/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/olej/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go-1.13"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.13/pkg/tool/linux_amd64"
GCCGO="/usr/bin/gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build243017218=/tmp/go-build -gno-record-gcc-switches"
О переменных окружения Go:
Код: Выделить всё
olej@R420:~$ go help environment
The go command and the tools it invokes consult environment variables
for configuration. If an environment variable is unset, the go command
uses a sensible default setting. To see the effective setting of the
variable <NAME>, run 'go env <NAME>'. To change the default setting,
run 'go env -w <NAME>=<VALUE>'. Defaults changed using 'go env -w'
are recorded in a Go environment configuration file stored in the
per-user configuration directory, as reported by os.UserConfigDir.
The location of the configuration file can be changed by setting
the environment variable GOENV, and 'go env GOENV' prints the
effective location, but 'go env -w' cannot change the default location.
See 'go help env' for details.
General-purpose environment variables:
GCCGO
The gccgo command to run for 'go build -compiler=gccgo'.
GOARCH
The architecture, or processor, for which to compile code.
Examples are amd64, 386, arm, ppc64.
GOBIN
The directory where 'go install' will install a command.
GOCACHE
The directory where the go command will store cached
information for reuse in future builds.
GODEBUG
Enable various debugging facilities. See 'go doc runtime'
for details.
GOENV
The location of the Go environment configuration file.
Cannot be set using 'go env -w'.
GOFLAGS
A space-separated list of -flag=value settings to apply
to go commands by default, when the given flag is known by
the current command. Each entry must be a standalone flag.
Because the entries are space-separated, flag values must
not contain spaces. Flags listed on the command line
are applied after this list and therefore override it.
GOOS
The operating system for which to compile code.
Examples are linux, darwin, windows, netbsd.
GOPATH
For more details see: 'go help gopath'.
GOPROXY
URL of Go module proxy. See 'go help modules'.
GOPRIVATE, GONOPROXY, GONOSUMDB
Comma-separated list of glob patterns (in the syntax of Go's path.Match)
of module path prefixes that should always be fetched directly
or that should not be compared against the checksum database.
See 'go help module-private'.
GOROOT
The root of the go tree.
GOSUMDB
The name of checksum database to use and optionally its public key and
URL. See 'go help module-auth'.
GOTMPDIR
The directory where the go command will write
temporary source files, packages, and binaries.
Environment variables for use with cgo:
AR
The command to use to manipulate library archives when
building with the gccgo compiler.
The default is 'ar'.
CC
The command to use to compile C code.
CGO_ENABLED
Whether the cgo command is supported. Either 0 or 1.
CGO_CFLAGS
Flags that cgo will pass to the compiler when compiling
C code.
CGO_CFLAGS_ALLOW
A regular expression specifying additional flags to allow
to appear in #cgo CFLAGS source code directives.
Does not apply to the CGO_CFLAGS environment variable.
CGO_CFLAGS_DISALLOW
A regular expression specifying flags that must be disallowed
from appearing in #cgo CFLAGS source code directives.
Does not apply to the CGO_CFLAGS environment variable.
CGO_CPPFLAGS, CGO_CPPFLAGS_ALLOW, CGO_CPPFLAGS_DISALLOW
Like CGO_CFLAGS, CGO_CFLAGS_ALLOW, and CGO_CFLAGS_DISALLOW,
but for the C preprocessor.
CGO_CXXFLAGS, CGO_CXXFLAGS_ALLOW, CGO_CXXFLAGS_DISALLOW
Like CGO_CFLAGS, CGO_CFLAGS_ALLOW, and CGO_CFLAGS_DISALLOW,
but for the C++ compiler.
CGO_FFLAGS, CGO_FFLAGS_ALLOW, CGO_FFLAGS_DISALLOW
Like CGO_CFLAGS, CGO_CFLAGS_ALLOW, and CGO_CFLAGS_DISALLOW,
but for the Fortran compiler.
CGO_LDFLAGS, CGO_LDFLAGS_ALLOW, CGO_LDFLAGS_DISALLOW
Like CGO_CFLAGS, CGO_CFLAGS_ALLOW, and CGO_CFLAGS_DISALLOW,
but for the linker.
CXX
The command to use to compile C++ code.
FC
The command to use to compile Fortran code.
PKG_CONFIG
Path to pkg-config tool.
Architecture-specific environment variables:
GOARM
For GOARCH=arm, the ARM architecture for which to compile.
Valid values are 5, 6, 7.
GO386
For GOARCH=386, the floating point instruction set.
Valid values are 387, sse2.
GOMIPS
For GOARCH=mips{,le}, whether to use floating point instructions.
Valid values are hardfloat (default), softfloat.
GOMIPS64
For GOARCH=mips64{,le}, whether to use floating point instructions.
Valid values are hardfloat (default), softfloat.
GOWASM
For GOARCH=wasm, comma-separated list of experimental WebAssembly features to use.
Valid values are satconv, signext.
Special-purpose environment variables:
GCCGOTOOLDIR
If set, where to find gccgo tools, such as cgo.
The default is based on how gccgo was configured.
GOROOT_FINAL
The root of the installed Go tree, when it is
installed in a location other than where it is built.
File names in stack traces are rewritten from GOROOT to
GOROOT_FINAL.
GO_EXTLINK_ENABLED
Whether the linker should use external linking mode
when using -linkmode=auto with code that uses cgo.
Set to 0 to disable external linking mode, 1 to enable it.
GIT_ALLOW_PROTOCOL
Defined by Git. A colon-separated list of schemes that are allowed
to be used with git fetch/clone. If set, any scheme not explicitly
mentioned will be considered insecure by 'go get'.
Because the variable is defined by Git, the default value cannot
be set using 'go env -w'.
Additional information available from 'go env' but not read from the environment:
GOEXE
The executable file name suffix (".exe" on Windows, "" on other systems).
GOGCCFLAGS
A space-separated list of arguments supplied to the CC command.
GOHOSTARCH
The architecture (GOARCH) of the Go toolchain binaries.
GOHOSTOS
The operating system (GOOS) of the Go toolchain binaries.
GOMOD
The absolute path to the go.mod of the main module,
or the empty string if not using modules.
GOTOOLDIR
The directory where the go tools (compile, cover, doc, etc...) are installed.
Команда go и инструменты, которые она вызывает, обращаются к переменным среды для конфигурации.
Если переменная среды не установлена, команда go использует разумную настройку по умолчанию.
Чтобы увидеть действующую настройку переменная <NAME>, запустите 'go env <NAME>'.
Чтобы изменить настройку по умолчанию, запустите 'go env -w <ИМЯ>=<ЗНАЧЕНИЕ>'.
Значения по умолчанию измененные с помощью «go env -w» записываются в файл конфигурации среды Go,
хранящийся в каталоге конфигурации для каждого пользователя, как сообщает os.UserConfigDir.
Расположение файла конфигурации можно изменить, установив переменная среды GOENV,
а 'go env GOENV' печатает эффективное местоположение, но «go env -w» не может изменить местоположение по умолчанию.
Подробнее см. «go help env».
Код: Выделить всё
olej@R420:~$ go env GOENV
/home/olej/.config/go/env
olej@R420:~$ ls -l /home/olej/.config/go/env
ls: невозможно получить доступ к '/home/olej/.config/go/env': Нет такого файла или каталога
olej@R420:~$ ls -dl /home/olej/.config/g*
drwx------ 5 olej olej 4096 фев 13 11:19 /home/olej/.config/geany
drwx------ 2 olej olej 4096 фев 9 01:10 /home/olej/.config/gnome-games
drwxr-xr-x 2 olej olej 4096 мая 6 2021 /home/olej/.config/goa-1.0
drwx------ 32 olej olej 4096 окт 8 18:26 /home/olej/.config/google-chrome
drwx------ 2 olej olej 4096 окт 14 23:58 /home/olej/.config/gtk-2.0
drwx------ 2 olej olej 4096 фев 13 10:52 /home/olej/.config/gtk-3.0
Код: Выделить всё
olej@R420:~$ ls -l `go env GOPATH`
итого 12
drwxrwxr-x 2 olej olej 4096 янв 20 03:02 bin
drwxrwxr-x 3 olej olej 4096 янв 20 02:41 pkg
drwxrwxr-x 8 olej olej 4096 фев 13 21:20 src
Код: Выделить всё
olej@R420:~/go/src$ pwd
/home/olej/go/src
olej@R420:~/go/src$ mkdir mtime
olej@R420:~/go/src$ mkdir mchan
olej@R420:~/go/src$ mkdir multy
Код: Выделить всё
olej@R420:~/go/src$ ls `go env GOPATH`/src/mtime
mtime.go
olej@R420:~/go/src$ ls `go env GOPATH`/src/mchan
mchan.go
olej@R420:~/go/src$ ls `go env GOPATH`/src/multy
multy.go
А теперь из любого произвольного каталога файловой системы (важно только имя пользователя под которым я залогинен в системе) ... я даже специально для этого создам новый свежий каталог:
Код: Выделить всё
olej@R420:~/2022/Go/work$ pwd
/home/olej/2022/Go/work
olej@R420:~/2022/Go/work$ ls -a
. ..
Код: Выделить всё
olej@R420:~/2022/Go/work$ go build multy
olej@R420:~/2022/Go/work$ go build mtime
olej@R420:~/2022/Go/work$ go build mchan
olej@R420:~/2022/Go/work$ ls -a
. .. mchan mtime multy
Код: Выделить всё
olej@R420:~/2022/Go/work$ file *
mchan: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=hJKnrnyzYTePKFKVubjn/FjZIJqAgWAWJp_rdnPtu/_PRjRBlMTFUhjMZSqpGb/XMa-uxVVl35BodOgcv0p, not stripped
mtime: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=cZC99kqMvRDc4d2TKSVj/1hBpuJRqX70XeAmGAx-_/TAOltk030dddK19McI9W/ubZrd8RxMhJ8CkmvZ4Xw, not stripped
multy: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=RyqIny51IzYHv50zNLEG/zHQucmK3bRfFyW676wLl/bnzAd5_qxFnGvJR_fwZW/szQZ-aoB0UCLV8bdAYb9, not stripped
Код: Выделить всё
olej@R420:~/2022/Go/work$ ls -al
итого 6464
drwxrwxr-x 2 olej olej 4096 фев 13 23:38 .
drwxrwxr-x 5 olej olej 4096 фев 13 23:36 ..
-rwxrwxr-x 1 olej olej 2284688 фев 13 23:38 mchan
-rwxrwxr-x 1 olej olej 2284876 фев 13 23:38 mtime
-rwxrwxr-x 1 olej olej 2038362 фев 13 23:37 multy
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей