Go: инструментарий (продолжение)

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 02:44

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.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 02:47

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.


Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 12:19

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.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 13:39

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.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 14:29

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" - но с этим нужно разбираться отдельно.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 16:46

О кросс-компиляции и переносимости:
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 секунд :lol: :

Код: Выделить всё

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 - всё было приведено в соответствие (без какого либо дополнительного указания)!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 18:10

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"

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 20:05

В качестве IDE (мне не нужно IDE в Linux :lol: ) для работы с кодом Go я использую "развитый терминал" Geany (см. IDE) ... тем более что в нём прямо (F8) я могу делать (не набирая команду) build + настроить на его вкладке терминала mc на отрабатываемый каталог ... вот так, примерно ;-) :
Вложения
Снимок экрана от 2022-01-20 18-57-33.png
Снимок экрана от 2022-01-20 18-57-33.png (242.79 КБ) 1003 просмотра

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go

Непрочитанное сообщение Olej » 20 янв 2022, 20:32

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.
Останусь, пока, при этом мнении, пока не встречу внятного разъяснения этого вопроса. :roll:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Go (продолжение)

Непрочитанное сообщение Olej » 23 янв 2022, 17:49

Интересное замечание - в Let's Go: объектно-ориентированное программирование на Голанге:
by Gigi Sayfan Aug 19, 2016
Корни Go основаны на C и, в более широком смысле, на семействе Algol. Кен Томпсон в шутку сказал, что Роб Пайк, Роберт Грейнджер и он сам собрались вместе и решили, что они ненавидят C ++. Будь то шутка или нет, Go сильно отличается от C ++. Подробнее об этом позже. Go - это предельная простота Это подробно объясняется Робом Пайком в "Меньше в геометрической прогрессии".
Я уже в своём конспекте Go ( Go конспект) ещё лет 8 назад описал (своё мнение), что Кен Томпсон и Роб Пайк создали Go как иллюстрацию "как бы мы создали язык C через 40 лет после того" :lol:

P.S. Кстати, приведенная по ссылке статья (перевод) - очень интересная в объяснении логики объектного программирования в Go "на пальцах".

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей