Страница 2 из 8
Re: Go
Добавлено: 20 янв 2022, 02:44
Olej
Olej писал(а): ↑20 янв 2022, 01:47
Статическая сборка (что описывается как большое достоинство Golang)
Вот очень хорошая статья:
Кросс-компиляция в Go, "на пальцах" разъясняющая почему они в Go ратуют за статическую сборку: кросс-компиляция, и переносимость
на любую аппаратную и операционную платформу!
2 февраля 2015 в 03:36
Вот как я элементарно тут же, не выходя из своего Linux, собираю всё то же тестовое приложение для 2-х (32-бит + 64-бит) Windows:
Код: Выделить всё
olej@R420:~/2022/Go$ GOOS=windows GOARCH=386 go build -o hello.1.exe
olej@R420:~/2022/Go$ GOOS=windows GOARCH=amd64 go build -o hello.2.exe
Код: Выделить всё
olej@R420:~/2022/Go$ ls -l *.exe
-rwxrwxr-x 1 olej olej 1901056 янв 20 01:30 hello.1.exe
-rwxrwxr-x 1 olej olej 2138112 янв 20 01:31 hello.2.exe
Код: Выделить всё
olej@R420:~/2022/Go$ file *.exe
hello.1.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
hello.2.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Точно так же, обратным порядком, я могу собирать под свой Linux приложения на Android-планшете, или на Mac-book.
На данный момент для актуальной версии Go 1.4.1 реализована поддержка следующих платформ:
Linux 2.61 и выше — amd64, 386, arm
MacOS X 10.6 и выше — amd64, 386
Windows XP и выше — amd64, 386
FreeBSD 8 и выше — amd64, 386, arm
NetBSD — amd64, 386, arm
OpenBSD — amd64, 386
DragonFly BSD — amd64, 386
Plan 9 — amd64, 386
Google Native Client — amd64p32, 386
Android — arm
Нужно будет из своей инсталляции GoLang выудить полный список переменных GOOS + GOARCH - в GoLang отличная система help.
Re: Go
Добавлено: 20 янв 2022, 02:47
Olej
Olej писал(а): ↑20 янв 2022, 02:44
Нужно будет из своей инсталляции GoLang выудить полный список переменных GOOS + GOARCH - в GoLang отличная система help.
Код: Выделить всё
olej@R420:~/2022/Go$ go --help
Go is a tool for managing Go source code.
Usage:
go <command> [arguments]
The commands are:
bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get add dependencies to current module and install them
install compile and install packages and dependencies
list list packages or modules
mod module maintenance
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet report likely mistakes in packages
Use "go help <command>" for more information about a command.
Additional help topics:
buildmode build modes
c calling between Go and C
cache build and test caching
environment environment variables
filetype file types
go.mod the go.mod file
gopath GOPATH environment variable
gopath-get legacy GOPATH go get
goproxy module proxy protocol
importpath import path syntax
modules modules, module versions, and more
module-get module-aware go get
module-auth module authentication using go.sum
module-private module configuration for non-public modules
packages package lists and patterns
testflag testing flags
testfunc testing functions
Use "go help <topic>" for more information about that topic.
Re: Go
Добавлено: 20 янв 2022, 12:19
Olej
Olej писал(а): ↑20 янв 2022, 00:55
P.S. Начав с того, что просто начисто поменялось сравнительно с версией Golang 1.5, когда писался конспект...
Иду по своему же конспекту, и отмечаю что поменялось с того времени (около 5-летней давности, а Go очень стремительно развивается)...
Например: GCCGO и GoLang теперь никак не устанавливаются в системе как альтернативы (с точки зрения системных альтернатив -
alternatives):
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Go$ update-alternatives --display go
update-alternatives: ошибка: нет альтернатив для go
Основной и базовый проект, естественно, GoLang ... а GCCGO? я даже не знаю его место и смысл ... - ещё один компилятор под Linux в рамках проекта GoLang?
Или даже ищу и нахожу то (по мелочам), что в конспекте (во времена конспекта) написано там просто неточно, ошибочно
...
Например относительно установки переменных окружения, в частности GOROOT:
Код: Выделить всё
olej@R420:~/2022/Go$ 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-build243457083=/tmp/go-build -gno-record-gcc-switches"
Но:
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/Go$ env | grep GO
olej@R420:~/2022/own.BOOKs/Go$
P.S. Go (Русский):
$GOPATH
В языке Go поиск программ и их зависимостей (например, import "пакет"), сначала выполняется в каталогах, прописанных в переменную $GOPATH, а затем - в переменной $GOROOT (путь установки go, по умолчанию /usr/lib/go).
Значение $GOPATH по умолчанию ~/go.
Re: Go
Добавлено: 20 янв 2022, 13:39
Olej
Olej писал(а): ↑20 янв 2022, 12:19
Иду по своему же конспекту, и отмечаю что поменялось с того времени
Форматирование кода Go в единообразном стиле:
Код: Выделить всё
olej@R420:~/go/src/hello$ ls -l hello.go
-rw-r--r-- 1 olej olej 601 янв 20 01:29 hello.go
Код: Выделить всё
olej@R420:~/go/src/hello$ go fmt hello.go
hello.go
Код: Выделить всё
olej@R420:~/go/src/hello$ ls -l hello.go
-rw-r--r-- 1 olej olej 557 янв 20 03:28 hello.go
Видно, что размер файла исходника
поменялся.
Вот как выглядит предыдущий код, отформатированный fmt - скопировано с mcedit в режиме отображения табуляций и концевых (висящих) пробелов:
Код: Выделить всё
package main
/* первая программа
демонстрирующая
синтаксис языка Go */
import (
<------>"fmt"
<------>"os"
)
func main() {
<------>fmt.Println("ты кто будешь?")
<------>fmt.Printf("> ")
<------>буфер := make([]byte, 120)
<------>длина, _ := os.Stdin.Read(буфер) // возвращается 2 значения
<------>Ω := длина
<------>ответ := string(буфер[:Ω-1]) // убрали '\n'
<------>fmt.Printf("какое длинное имя ... целых %d байт\n", Ω)
<------>fmt.Printf("привет, %s\n", ответ)
}
Видно что отформатировал он отступы с TAB.
Re: Go
Добавлено: 20 янв 2022, 14:29
Olej
Olej писал(а): ↑20 янв 2022, 13:39
Вот как выглядит предыдущий код, отформатированный fmt
Или, в этом же качестве, можно использовать:
Код: Выделить всё
olej@R420:~/go/src/hello$ which gofmt
/usr/bin/gofmt
Код: Выделить всё
olej@R420:~/go/src/hello$ gofmt --help
usage: gofmt [flags] [path ...]
-cpuprofile string
write cpu profile to this file
-d display diffs instead of rewriting files
-e report all errors (not just the first 10 on different lines)
-l list files whose formatting differs from gofmt's
-r string
rewrite rule (e.g., 'a[b:len(a)] -> a[b:]')
-s simplify code
-w write result to (source) file instead of stdout
Особенно меня в этом заинтересовало: "-s simplify code" - но с этим нужно разбираться отдельно.
Re: Go
Добавлено: 20 янв 2022, 16:46
Olej
О кросс-компиляции и переносимости:
Olej писал(а): ↑20 янв 2022, 02:44
Вот как я элементарно тут же, не выходя из своего Linux, собираю всё то же тестовое приложение для 2-х (32-бит + 64-бит) Windows:
Код: Выделить всё
olej@R420:~/2022/Go/src/hello$ file hello.32.exe
hello.32.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows
olej@R420:~/2022/Go/src/hello$ file hello.64.exe
hello.64.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Вот выполнение 32/64 бит приложений в виртуальной машине Windows 10 (64 бит) ... подготовка и выполнение которых в Linux потребовало 10
секунд :
Код: Выделить всё
X:\Users\Default\Downloads>dir
Volume in drive X is Boot
Volume Serial Number is D60A-0DC2
Directory of X:\Users\Default\Downloads
06/20/2018 02:00 AM <DIR> .
06/20/2018 02:00 AM <DIR> ..
01/20/2022 03:25 PM 1,054,653 drive-download-20220120T132509Z-001.zip
01/20/2022 03:30 PM 1,901,056 hello.32.exe
01/20/2022 03:30 PM 2,138,112 hello.64.exe
3 File(s) 5,093,821 bytes
2 Dir(s) 368,934,912 bytes free
X:\Users\Default\Downloads>hello.32.exe
ты кто будешь?
> bastard
какое длинное имя ... целых 9 байт
привет, bastard
X:\Users\Default\Downloads>hello.64.exe
ты кто будешь?
> mudak
какое длинное имя ... целых 7 байт
привет, mudak
... и бинарный исполнимый формат .exe, и кодировки CP-1251 - всё было приведено в соответствие (
без какого либо дополнительного указания)!
Re: Go
Добавлено: 20 янв 2022, 18:10
Olej
Olej писал(а): ↑20 янв 2022, 02:44
Точно так же, обратным порядком, я могу собирать под свой Linux приложения на Android-планшете, или на Mac-book.
Свежее состояние поддерживаемых кросс-платформ можно уточнить здесь:
Go (Golang) GOOS and GOARCH
All of the following information is based on go version go1.17.1 darwin/amd64.
17 ОС:
All GOOS values:
"aix", "android", "darwin", "dragonfly", "freebsd", "hurd", "illumos", "ios", "js", "linux", "nacl", "netbsd", "openbsd", "plan9", "solaris", "windows", "zos"
Для 24 аппаратных архитектур:
All GOARCH values:
"386", "amd64", "amd64p32", "arm", "arm64", "arm64be", "armbe", "loong64", "mips", "mips64", "mips64le", "mips64p32", "mips64p32le", "mipsle", "ppc", "ppc64", "ppc64le", "riscv", "riscv64", "s390", "s390x", "sparc", "sparc64", "wasm"
Re: Go
Добавлено: 20 янв 2022, 20:05
Olej
В качестве IDE (мне не нужно IDE в Linux
) для работы с кодом Go я использую "развитый терминал" Geany (см.
IDE) ... тем более что в нём прямо (F8) я могу делать (не набирая команду) build + настроить на его вкладке терминала mc на отрабатываемый каталог ... вот так, примерно
:
Re: Go
Добавлено: 20 янв 2022, 20:32
Olej
Olej писал(а): ↑20 янв 2022, 12:19
Основной и базовый проект, естественно, GoLang ... а GCCGO? я даже не знаю его место и смысл ... - ещё один компилятор под Linux в рамках проекта GoLang?
GCCGO против «стандартной» реализации
20 февраля 2018 в 12:42
...
Введение
На данный момент существуют две наиболее зрелые реализации языка программирования Go:
1. gc (5g/6g/8g/etc.) — первая, "стандартная" реализация.
2. gccgo — frontend компилятора GCC для Go.
Публикаций множество ... Но, по-моему,
до сегодня никто толком не понимает предназначение и разницу проектов GoLang и GCCGO.
Останусь, пока, при этом мнении, пока не встречу внятного разъяснения этого вопроса.
Re: Go (продолжение)
Добавлено: 23 янв 2022, 17:49
Olej
Интересное замечание - в
Let's Go: объектно-ориентированное программирование на Голанге:
by Gigi Sayfan Aug 19, 2016
Корни Go основаны на C и, в более широком смысле, на семействе Algol. Кен Томпсон в шутку сказал, что Роб Пайк, Роберт Грейнджер и он сам собрались вместе и решили, что они ненавидят C ++. Будь то шутка или нет, Go сильно отличается от C ++. Подробнее об этом позже. Go - это предельная простота Это подробно объясняется Робом Пайком в
"Меньше в геометрической прогрессии".
Я уже в своём конспекте Go (
Go конспект) ещё лет 8 назад описал (своё мнение), что Кен Томпсон и Роб Пайк создали Go как иллюстрацию "как бы мы создали язык C через 40 лет после того"
P.S. Кстати, приведенная по ссылке статья (перевод) - очень интересная в объяснении
логики объектного программирования в Go "на пальцах".