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

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

Модератор: Olej

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

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

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

Было рассмотрение языка Go уже здесь в темах (начало см. там):
Go
Примеры кода Go
cборка приложений Go
GUI на Go
По результатам этих разбирательств мной даже был написан конспект (язык Go), последнюю редакцию которого можно найти (с архивом примеров кодов) здесь: Go конспект
Номер последней редакции: 1.42
Объём (страниц): 124
Дата редактирования: 17 апреля 2017

Скачать эту редакцию текст и архив примеров к нему можно:
Google: текст и архив
Yandex: текст и архив
Но это дела прошлые... написано это было, главным образом в 2014-2015г.г.
А есть время и оказия разобраться, хотя бы посмотреть, что там поменялось за это время (а поменялось много! ;-) ).

P.S. Начав с того, что просто начисто поменялось сравнительно с версией Golang 1.5, когда писался конспект...

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

Re: Go

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

Golang:

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

olej@R420:~$ aptitude search golang
p   dh-golang                                                         - debhelper add-on for packaging software written in Go (golang)
p   dh-make-golang                                                    - tool that converts Go packages into Debian package source
p   golang                                                            - Go programming language compiler - metapackage
p   golang-1.12-race-detector-runtime                                 - Runtime support for Go's race detector
...
И ещё много-много пакетов:

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

olej@R420:~$ aptitude search golang | wc -l
1377
Тут разбираться и разбираться! На любой вкус и потребность.

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

olej@R420:~$ aptitude show golang
Пакет: golang
Версия: 2:1.13~1ubuntu2
Новый: да
Состояние: не установлен
Приоритет: необязательный
Раздел: devel
Сопровождающий: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Архитектура: amd64
Размер в распакованном виде: 12,3 k
Зависит: golang-1.13, golang-doc (>= 2:1.13~1ubuntu2), golang-go (>= 2:1.13~1ubuntu2), golang-src (>= 2:1.13~1ubuntu2)
Описание: Go programming language compiler - metapackage
 The Go programming language is an open source project to make programmers more productive. Go is expressive, concise, clean, and efficient. Its concurrency
 mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular
 program construction. Go compiles quickly to machine code yet has the convenience of garbage collection and the power of run-time reflection. It's a fast,
 statically typed, compiled language that feels like a dynamically typed, interpreted language.

 This package is a metapackage that, when installed, guarantees that (most of) a full Go development environment is installed.
Домашняя страница: https://golang.org

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

olej@R420:~$ sudo apt install golang
[sudo] пароль для olej:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Будут установлены следующие дополнительные пакеты:
  golang-1.13 golang-1.13-doc golang-1.13-go golang-1.13-race-detector-runtime golang-1.13-src golang-doc golang-go golang-race-detector-runtime golang-src
Предлагаемые пакеты:
  bzr | brz mercurial subversion
Следующие НОВЫЕ пакеты будут установлены:
  golang golang-1.13 golang-1.13-doc golang-1.13-go golang-1.13-race-detector-runtime golang-1.13-src golang-doc golang-go golang-race-detector-runtime
  golang-src
Обновлено 0 пакетов, установлено 10 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 63,5 MB архивов.
После данной операции объём занятого дискового пространства возрастёт на 329 MB.
Хотите продолжить? [Д/н] y
...

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

olej@R420:~$ which go
/usr/bin/go

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

olej@R420:~$ go version
go version go1.13.8 linux/amd64

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

Re: Go

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

Вариант компилятора GCC - gccgo:

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

olej@R420:~$ aptitude search gccgo
p   gccgo                                                                  - Go compiler, based on the GCC backend
p   gccgo:i386                                                             - Go compiler, based on the GCC backend
p   gccgo-10                                                               - GNU Go compiler
p   gccgo-10:i386                                                          - GNU Go compiler
p   gccgo-10-aarch64-linux-gnu                                             - GNU Go compiler
p   gccgo-10-aarch64-linux-gnu:i386                                        - GNU Go compiler
p   gccgo-10-alpha-linux-gnu                                               - GNU Go compiler
p   gccgo-10-alpha-linux-gnu:i386                                          - GNU Go compiler
p   gccgo-10-arm-linux-gnueabi                                             - GNU Go compiler
...
И ещё множество аппаратных архитектур:

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

olej@R420:~$ aptitude search gccgo | wc -l
204

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

olej@R420:~$ aptitude show gccgo
Пакет: gccgo
Версия: 4:10.0-1ubuntu2
Новый: да
Состояние: не установлен
Приоритет: необязательный
Раздел: universe/devel
Сопровождающий: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Архитектура: amd64
Размер в распакованном виде: 13,3 k
Зависит: cpp (>= 4:9.3.0-1ubuntu2), gcc (>= 4:9.3.0-1ubuntu2), gccgo-10 (>= 10-20200307-0ubuntu1~)
Предлагает: gccgo-multilib
Конфликтует: gccgo:i386
Предоставляет: go-compiler
Описание: Go compiler, based on the GCC backend
 This is the GNU Go compiler, which compiles Go on platforms supported by the gcc compiler. It uses the gcc backend to generate optimized code.

 This is a dependency package providing the default GNU Go compiler.

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

olej@R420:~$ sudo apt install gccgo
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Будут установлены следующие дополнительные пакеты:
  cpp-10 gcc-10 gccgo-10 libasan6 libgcc-10-dev libgo-10-dev libgo16
Предлагаемые пакеты:
  gcc-10-locales gcc-10-multilib gcc-10-doc gccgo-multilib gccgo-10-doc
Следующие НОВЫЕ пакеты будут установлены:
  cpp-10 gcc-10 gccgo gccgo-10 libasan6 libgcc-10-dev libgo-10-dev libgo16
Обновлено 0 пакетов, установлено 8 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 67,3 MB архивов.
После данной операции объём занятого дискового пространства возрастёт на 308 MB.
Хотите продолжить? [Д/н] y
...

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

olej@R420:~$ which gccgo
/usr/bin/gccgo

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

olej@R420:~$ gccgo --version
gccgo (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

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

Re: Go

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

Беру простейшее приложение из конспекта, и начинаю его компилировать/собирать разным образом, сравнивая с тем что было...
Приложение в том совершенно неизменном виде, демонстрирующее (самому себе напоминаю ;-) ) однострочные и многострочные комментарии, использование кодировки UTF-8 и для текстовых констант и для представления самого кода, имён переменных...

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

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", ответ )
}
Вложения
hello.go
(601 байт) 49 скачиваний

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

Re: Go

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

Olej писал(а):
20 янв 2022, 01:37
Беру простейшее приложение из конспекта
Вариант GCC:

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

olej@R420:~/2022/Go$ gccgo hello.go -o hello.1 

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

olej@R420:~/2022/Go$ ls -l hello.1
-rwxrwxr-x 1 olej olej 52464 янв 20 00:12 hello.1

olej@R420:~/2022/Go$ ldd hello.1
    linux-vdso.so.1 (0x00007ffcf38f2000)
    libgo.so.16 => /lib/x86_64-linux-gnu/libgo.so.16 (0x00007fd41551a000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd4154ff000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd41530d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fd416d85000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd4152ea000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd41519b000)

olej@R420:~/2022/Go$ file hello.1
hello.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6d4506b84e6f707a80e1d434c1c1b50c278cfc24, for GNU/Linux 3.2.0, with debug_info, not stripped
Совершенно традиционная Linux сборка с shared библиотеками.
Всё работоспособно:

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

olej@R420:~/2022/Go$ ./hello.1 
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася

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

Re: Go

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

Olej писал(а):
20 янв 2022, 01:37
Беру простейшее приложение
Вариант Golang в его самом штатном (типовом) исполнении:

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

olej@R420:~/2022/Go$ go build -o hello.2 -compiler gc hello.go 

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

olej@R420:~/2022/Go$ ls -l hello.2
-rwxrwxr-x 1 olej olej 2038125 янв 20 00:14 hello.2

olej@R420:~/2022/Go$ ldd hello.2
    не является динамическим исполняемым файлом

olej@R420:~/2022/Go$ file hello.2
hello.2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=sDWlLc5B4-6Q08mhUwYL/wbB6y0Sh_z1O-ldB4zbH/DEFIpmgTjqmro_2FnANV/Rmy_4aY1Qu3I6yGoF4Rh, not stripped
Статическая сборка (что описывается как большое достоинство Golang), всё опять так же работоспособное:

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

olej@R420:~/2022/Go$ ./hello.2
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася

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

Re: Go

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

Olej писал(а):
20 янв 2022, 01:37
Беру простейшее приложение
Вариант Golang, но с указанием ему использовать для сборки компилятор GCC:

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

olej@R420:~/2022/Go$ go build -o hello.3 -compiler gccgo hello.go

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

olej@R420:~/2022/Go$ ls -l hello.3
-rwxrwxr-x 1 olej olej 62544 янв 20 00:20 hello.3

olej@R420:~/2022/Go$ ls -l hello.3
-rwxrwxr-x 1 olej olej 62544 янв 20 00:20 hello.3

olej@R420:~/2022/Go$ ldd hello.3
    linux-vdso.so.1 (0x00007ffc8afaf000)
    libgo.so.16 => /lib/x86_64-linux-gnu/libgo.so.16 (0x00007f9f96a18000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9f969fd000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9f9680b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9f98283000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9f967e8000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9f96699000)

olej@R420:~/2022/Go$ file hello.3
hello.3: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped
Сборка поменялась на shared...
Но она не эквивалента сборке gccgo (где-то как-то дефаултные параметры различаются), это видно по размеру исполнимого ELF-файла:

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

olej@R420:~/2022/Go$ ls -l hello.*
-rwxrwxr-x 1 olej olej   52464 янв 20 00:12 hello.1
-rwxrwxr-x 1 olej olej 2038125 янв 20 00:20 hello.2
-rwxrwxr-x 1 olej olej   62544 янв 20 00:20 hello.3
-rw-r--r-- 1 olej olej     601 авг 10  2014 hello.go

Всё так же работоспособно:

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

olej@R420:~/2022/Go$ ./hello.3
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася

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

Re: Go

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

Olej писал(а):
20 янв 2022, 01:37
Беру простейшее приложение
Пробую собрать shared вариант, чисто указав на это Golang ... то как это успешно собиралось в 2015г.:

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

olej@R420:~/2022/Go$ go build -o hello.4 -linkshared -compiler gc hello.go
# command-line-arguments
/usr/lib/go-1.13/pkg/tool/linux_amd64/link: cannot implicitly include runtime/cgo in a shared library
Вот так!
И отдельного пакета для этого, как было в версии 1.5, нет:

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

olej@R420:~$ aptitude search golang-shared
olej@R420:~$

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

Re: Go

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

Olej писал(а):
20 янв 2022, 01:57
Вот так!
Но сама подсказка подсказывает, что не хватает модуля CGO - модуля связи языков C и Go, о котором много пишут, и которым я займусь отдельно ... вот пока самое интересное:
C? Go? Cgo!
Exploring shared objects in Go
Feb 12, 2017 post
cgo.Documentation
Пока мне достаточно указать 1 допонительный import ("C"):

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

package main

/* первая программа
   демонстрирующая 
   синтаксис языка Go */

import "C"
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", ответ )
}
И ... ;-)

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

olej@R420:~/2022/Go$ go build -o hello.4 -linkshared -compiler gc hello.go

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

olej@R420:~/2022/Go$ ls -l hello.4
-rwxrwxr-x 1 olej olej 3524368 янв 20 01:01 hello.4

olej@R420:~/2022/Go$ ldd hello.4
	linux-vdso.so.1 (0x00007ffd22552000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4455aa5000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f44558b3000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f4455df6000)

olej@R420:~/2022/Go$ file hello.4
hello.4: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=610b7cf30acd5bca5b849d4e005b6f9f5a238cba, for GNU/Linux 3.2.0, not stripped
Всё собрано динамически!
Список подключаемых библиотек совсем не тот, что при сборке GCC.
Всё так же работоспособно:

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

olej@R420:~/2022/Go$ ./hello.4
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася
Но если мы сравним размеры :-o :

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

olej@R420:~/2022/Go$ ls -l hello.*
-rwxrwxr-x 1 olej olej   52464 янв 20 00:12 hello.1
-rwxrwxr-x 1 olej olej 2038125 янв 20 00:20 hello.2
-rwxrwxr-x 1 olej olej   62544 янв 20 00:20 hello.3
-rwxrwxr-x 1 olej olej 3524368 янв 20 01:01 hello.4
-rw-r--r-- 1 olej olej     612 янв 20 01:01 hello.go
- то на это раз наша динамическая сборка много более громоздкая, чем статическая...
Но это, предполагаю, только на очень маленьком фрагменте кода.
Вложения
hello.go
(612 байт) 50 скачиваний

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

Re: Go

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

Olej писал(а):
20 янв 2022, 01:37
Беру простейшее приложение
Последнее, что хочу проверить (сохранилось ли?) - это интерпретирующее выполнение Go-кода вообще без компиляции ... т.е., если быть совсем точным, выполнение компиляции "по ходу", JIT (Just In Time):

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

olej@R420:~/2022/Go$ go run hello.go
ты кто будешь?
> вася
какое длинное имя ... целых 9 байт
привет, вася
С этим всё ОК! ;-)

Ответить

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

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

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