Инструменты Go

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

Модератор: Olej

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

Re: Go

Непрочитанное сообщение Olej » 26 май 2016, 11:12

Olej писал(а): Базовым материалом, на этот раз, будет вот та книжка Кэрнигана, показанная выше.
В книге много интересных и полезных примеров кода (в отличие от обычных для большинства книг примеров бла-бла-бла, высосанных из пальца).
Я буду здесь отмечать (себе на памятку) только те немногие, которые особо полезны на практике.
Таким безусловно является обработка опций командной строки запуска программы, на манер того, что делает POSIX getopt().

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

// Echo4 prints its command-line arguments.
package main

import (
        "flag"
        "fmt"
        "strings"
)

var n = flag.Bool("n", false, "omit trailing newline")
var sep = flag.String("s", " ", "separator")

func main() {
        flag.Parse()
        fmt.Print(strings.Join(flag.Args(), *sep))
        if !*n {
                fmt.Println()
        }
}

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

[olej@dell bin]$ go build gopl.io/ch2/echo4

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

[olej@dell bin]$ ./echo4 a bc def
a bc def
[olej@dell bin]$ ./echo4 -n a bc def
a bc def[olej@dell bin]$ 
[olej@dell bin]$ ./echo4 a bc def -n
a bc def -n

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

[olej@dell bin]$ ./echo4 -s / a/bc/def
a/bc/def
[olej@dell bin]$ ./echo4 -s/ a/bc/def
flag provided but not defined: -s/
Usage of ./echo4:
  -n	omit trailing newline
  -s string
    	separator (default " ")
[olej@dell bin]$ ./echo4 -s"/" a/bc/def
flag provided but not defined: -s/
Usage of ./echo4:
  -n	omit trailing newline
  -s string
    	separator (default " ")
Это не совсем то по поведению (к сожалению) что getopt(), но очень похоже...
P.S. "не совсем то" имеется в виду, что нельзя в командной строке, например, "пересыпать" опции (ключи) с параметрами ... но в целом это годится для написания консольных приложений, напоминающих поведением утилиты Linux.

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 08:06

Olej писал(а):Начинаю (в силу определённых обстоятельств) новый виток углубления в Go... и проверки что там сейчас и поменялось за 2 года.
Относительно инструментария (как с этим можно работать):
- в качестве редактора вполне пригоден и достаточен стандартный Geany:
iota_p105.png
- он понимает цветовую разметку кода Go
- его опция Build (F8) совершенно правильно собирает приложение с помощью Golang
- в нижнем фрейме вам ошибки...
- там же можно запускать и тестировать собранное приложение.
iota_p105-2.png
Всё в одном флаконе... ;-)

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 08:18

Olej писал(а): Относительно инструментария (как с этим можно работать):
По поводу справочной системы под рукой...
Читаем, например, в книге (стр. 97):
Для работы со строками в особенности важны четыре стандартных пакета: bytes, strings, strconv и unicode.
Справку по всем стандартным пакетам Go получаем тут-же из исходников здесь - Directory src/:

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

File 	  	Bytes 	  	Modified
..
Make.dist 		553 		2016-05-19 18:04:32 +0000 UTC
all.bash 		407 		2016-05-19 18:04:32 +0000 UTC
all.bat 		726 		2016-05-19 18:04:32 +0000 UTC
all.rc 		385 		2016-05-19 18:04:32 +0000 UTC
androidtest.bash 		2902 		2016-05-19 18:04:34 +0000 UTC
archive/ 		0 		0001-01-01 00:00:00 +0000 UTC
bootstrap.bash 		2050 		2016-05-19 18:04:34 +0000 UTC
bufio/ 		0 		0001-01-01 00:00:00 +0000 UTC
buildall.bash 		1821 		2016-05-19 18:04:34 +0000 UTC
builtin/ 		0 		0001-01-01 00:00:00 +0000 UTC
bytes/ 		0 		0001-01-01 00:00:00 +0000 UTC
clean.bash 		521 		2016-05-19 18:04:32 +0000 UTC
clean.bat 		565 		2016-05-19 18:04:32 +0000 UTC
clean.rc 		380 		2016-05-19 18:04:32 +0000 UTC
cmd/ 		0 		0001-01-01 00:00:00 +0000 UTC
compress/ 		0 		0001-01-01 00:00:00 +0000 UTC
container/ 		0 		0001-01-01 00:00:00 +0000 UTC
crypto/ 		0 		0001-01-01 00:00:00 +0000 UTC
database/ 		0 		0001-01-01 00:00:00 +0000 UTC
debug/ 		0 		0001-01-01 00:00:00 +0000 UTC
encoding/ 		0 		0001-01-01 00:00:00 +0000 UTC
errors/ 		0 		0001-01-01 00:00:00 +0000 UTC
expvar/ 		0 		0001-01-01 00:00:00 +0000 UTC
flag/ 		0 		0001-01-01 00:00:00 +0000 UTC
fmt/ 		0 		0001-01-01 00:00:00 +0000 UTC
go/ 		0 		0001-01-01 00:00:00 +0000 UTC
hash/ 		0 		0001-01-01 00:00:00 +0000 UTC
html/ 		0 		0001-01-01 00:00:00 +0000 UTC
image/ 		0 		0001-01-01 00:00:00 +0000 UTC
index/ 		0 		0001-01-01 00:00:00 +0000 UTC
internal/ 		0 		0001-01-01 00:00:00 +0000 UTC
io/ 		0 		0001-01-01 00:00:00 +0000 UTC
iostest.bash 		2020 		2016-05-19 18:04:32 +0000 UTC
log/ 		0 		0001-01-01 00:00:00 +0000 UTC
make.bash 		5667 		2016-05-19 18:04:34 +0000 UTC
make.bat 		3776 		2016-05-19 18:04:34 +0000 UTC
make.rc 		2933 		2016-05-19 18:04:32 +0000 UTC
math/ 		0 		0001-01-01 00:00:00 +0000 UTC
mime/ 		0 		0001-01-01 00:00:00 +0000 UTC
nacltest.bash 		1924 		2016-05-19 18:04:34 +0000 UTC
net/ 		0 		0001-01-01 00:00:00 +0000 UTC
os/ 		0 		0001-01-01 00:00:00 +0000 UTC
path/ 		0 		0001-01-01 00:00:00 +0000 UTC
race.bash 		853 		2016-05-19 18:04:32 +0000 UTC
race.bat 		1037 		2016-05-19 18:04:32 +0000 UTC
reflect/ 		0 		0001-01-01 00:00:00 +0000 UTC
regexp/ 		0 		0001-01-01 00:00:00 +0000 UTC
run.bash 		1283 		2016-05-19 18:04:32 +0000 UTC
run.bat 		1078 		2016-05-19 18:04:32 +0000 UTC
run.rc 		380 		2016-05-19 18:04:32 +0000 UTC
runtime/ 		0 		0001-01-01 00:00:00 +0000 UTC
sort/ 		0 		0001-01-01 00:00:00 +0000 UTC
strconv/ 		0 		0001-01-01 00:00:00 +0000 UTC
strings/ 		0 		0001-01-01 00:00:00 +0000 UTC
sync/ 		0 		0001-01-01 00:00:00 +0000 UTC
syscall/ 		0 		0001-01-01 00:00:00 +0000 UTC
testing/ 		0 		0001-01-01 00:00:00 +0000 UTC
text/ 		0 		0001-01-01 00:00:00 +0000 UTC
time/ 		0 		0001-01-01 00:00:00 +0000 UTC
unicode/ 		0 		0001-01-01 00:00:00 +0000 UTC
unsafe/ 		0 		0001-01-01 00:00:00 +0000 UTC
vendor/ 		0 		0001-01-01 00:00:00 +0000 UTC
Build version go1.6.2.
Ничего больше и не надо (описаний, разъяснений, ...) - всё просто и понятно.

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 08:48

Olej писал(а): В книге много интересных и полезных примеров кода
Красивый пример на использование генератора констант iota (стр.104)
Вложения
iota_p105-3.png

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 10:55

Olej писал(а): Сразу зафиксируем то, что ни в одной книжке, как правило, вам не расскажут:

1. Показанные выше компиляции собирают приложения со статической сборкой с библиотеками.

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

[olej@dell bin]$ ls -l helloworld 
-rwxr-xr-x. 1 olej olej 2367440 май 23 20:35 helloworld

[olej@dell bin]$ ldd helloworld 
	не является динамическим исполняемым файлом

[olej@dell bin]$ file helloworld 
helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Это хорошо, возможно, для embedded систем/приложений, или Windows.
Но вовсе не хорошо для Linux (см. размер исполнимого файла)

2. При некоторых условиях (опциями команд) сборка может быть динамическая, с использованием shared библиотек операционной системы:

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

 
[olej@dell bin]$ ldd fetch 
	linux-vdso.so.1 (0x00007ffd1c5e5000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5a94e62000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f5a94aa1000)
	/lib64/ld-linux-x86-64.so.2 (0x00005587fc664000)
С этими опциями я разберусь попозже.

3. Всё это относится к основному проекту Golang.
Но в проекте компилятора GCC (который поддерживает и так несколько языков программирования) развивается ветка Go:

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

[olej@localhost ~]$ dnf list gcc* | grep go
gcc-go.x86_64                                  5.3.1-6.fc23             updates

[olej@localhost ~]$ dnf info gcc-go
Последняя проверка окончания срока действия метаданных: 20 days, 1:23:24 назад, Sun May  1 15:47:26 2016.
Доступные пакеты
Имя         : gcc-go
Архитектура : x86_64
Эпоха       : 0
Версия      : 5.3.1
Релиз       : 6.fc23
Размер      : 8.9 M
Репозиторий : updates
Краткое опи : Go support
URL         : http://gcc.gnu.org
Лицензия    : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Описание    : The gcc-go package provides support for compiling Go programs
            : with the GNU Compiler Collection.
Где-то встречалось, что это тот же код компиляции Golang, имплементированный в GCC (все проекты - открытые), т.е. разговор в терминах "лучше-хуже", пожалуй, вряд ли уместен.
Пока я не стал устанавливать gcc-go на этот компьютер, чтобы он (по путям и умолчаниям) не смазывал, поначалу, картину с Golang.
На других компьютеров у меня стоит gcc-go (где-то я даже начинал инсталляцию именно с этого - он сам по себе самодостаточный и компилятор Go поставит по зависимостям).
При такой компиляции GCC использует динамическую сборку, и размер исполнимых файлов под Linux может быть в разы меньше.
Самое время доустановить и плагин Go из комплекта проекта GCC:

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

[olej@dell GoBook]$ sudo dnf install gcc-go 
[sudo] пароль для olej: 
Последняя проверка окончания срока действия метаданных: 1:57:41 назад, Tue May 31 08:43:15 2016.
Зависимости разрешены.
=====================================================================================================================================
 Package                          Архитектура                 Версия                              Репозиторий                  Размер
=====================================================================================================================================
Установка:
 gcc-go                           x86_64                      5.3.1-6.fc23                        updates                      8.9 M
 libgo                            x86_64                      5.3.1-6.fc23                        updates                      6.7 M
 libgo-devel                      x86_64                      5.3.1-6.fc23                        updates                      230 k

Результат операции
=====================================================================================================================================
Установка  3 Пакеты

Объем загрузки: 16 M
Объем изменений: 56 M
Продолжить? [д/Н]: y
Загрузка пакетов:
(1/3): libgo-devel-5.3.1-6.fc23.x86_64.rpm                                                           266 kB/s | 230 kB     00:00    
(2/3): libgo-5.3.1-6.fc23.x86_64.rpm                                                                 419 kB/s | 6.7 MB     00:16    
(3/3): gcc-go-5.3.1-6.fc23.x86_64.rpm                                                                451 kB/s | 8.9 MB     00:20    
-------------------------------------------------------------------------------------------------------------------------------------
Общий размер                                                                                         552 kB/s |  16 MB     00:29     
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно
Выполнение транзакции
  Установка    : libgo-5.3.1-6.fc23.x86_64                                                                                       1/3 
  Установка    : libgo-devel-5.3.1-6.fc23.x86_64                                                                                 2/3 
  Установка    : gcc-go-5.3.1-6.fc23.x86_64                                                                                      3/3 
  Проверка     : gcc-go-5.3.1-6.fc23.x86_64                                                                                      1/3 
  Проверка     : libgo-5.3.1-6.fc23.x86_64                                                                                       2/3 
  Проверка     : libgo-devel-5.3.1-6.fc23.x86_64                                                                                 3/3 

Установлено:
  gcc-go.x86_64 5.3.1-6.fc23                libgo.x86_64 5.3.1-6.fc23                libgo-devel.x86_64 5.3.1-6.fc23               

Выполнено!

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 11:01

Olej писал(а): Самое время доустановить и плагин Go из комплекта проекта GCC:

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

[olej@dell GoBook]$ which gccgo
/usr/bin/gccgo
[olej@dell GoBook]$ gccgo --version
gccgo (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
Copyright (C) 2015 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.
Но такая установка разрушает каким-то образом инсталляцию Golan ... чего не наблюдалось в Mint 17.1
Каким-то образом разрушилось:

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

[olej@dell bin]$ go env GOROOT
/usr
Пришлось сделать деинсталляцию:

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

[olej@dell tasks]$ sudo dnf remove gcc-go
[sudo] пароль для olej: 
Зависимости разрешены.
=====================================================================================================================================
 Package                          Архитектура                 Версия                             Репозиторий                   Размер
=====================================================================================================================================
Удаление:
 gcc-go                           x86_64                      5.3.1-6.fc23                       @updates                       24 M
 libgo                            x86_64                      5.3.1-6.fc23                       @updates                       31 M
 libgo-devel                      x86_64                      5.3.1-6.fc23                       @updates                      1.3 M

Результат операции
=====================================================================================================================================
Удаление  3 Пакеты

Объем изменений: 56 M
Продолжить? [д/Н]: y
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно
Выполнение транзакции
  Удаление     : gcc-go-5.3.1-6.fc23.x86_64                                                                                      1/3 
  Удаление     : libgo-devel-5.3.1-6.fc23.x86_64                                                                                 2/3 
  Удаление     : libgo-5.3.1-6.fc23.x86_64                                                                                       3/3 
  Проверка     : libgo-5.3.1-6.fc23.x86_64                                                                                       1/3 
  Проверка     : libgo-devel-5.3.1-6.fc23.x86_64                                                                                 2/3 
  Проверка     : gcc-go-5.3.1-6.fc23.x86_64                                                                                      3/3 

Удалено:
  gcc-go.x86_64 5.3.1-6.fc23                libgo.x86_64 5.3.1-6.fc23                libgo-devel.x86_64 5.3.1-6.fc23               

Выполнено!
После чего восстанавливается:

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

[olej@dell tasks]$ go env GOROOT
/usr/lib/golang
[olej@dell tasks]$ go env GOPATH
/home/olej/2016_WORK/GoBook
[olej@dell tasks]$ go build -compiler gc gopl.io/ch1/helloworld 
[olej@dell tasks]$ ls -l helloworld 
-rwxr-xr-x. 1 olej olej 2367440 май 31 12:38 helloworld
[olej@dell tasks]$ file helloworld 
helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
[olej@dell tasks]$ ./helloworld 
Hello, 世界
С этим нужно разбираться что там с ним происходит в Fedora 23!

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 13:10

Небольшая GoLang страничка для онлайновой компиляции и изучения работы кода на языке Go:
The Go Playground

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 15:26

Утверждается, что компиляция с Go выполняется намного быстрее, чем в любых других языках (особенно в сравнении с языками C и C++).
Представляется, в связи с этим, возможность использовать программы Go в качестве исполнимых скриптов (сценариев) операционной системы Linux.
Этому посвящено несколько независимых проектов. Меня интересует проект gorun (https://wiki.ubuntu.com/gorun , https://code.launchpad.net/~niemeyer/gorun/trunk).

1. Устанавливаю систему контроля версий Bazaar, используемую разработчиками Ubuntu:

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

[olej@dell .ssh]$ sudo dnf install bzr
[sudo] пароль для olej: 
Последняя проверка окончания срока действия метаданных: 0:20:12 назад, Tue May 31 14:58:30 2016.
Зависимости разрешены.
======================================================================================================================
 Package                         Архитектура            Версия                           Репозиторий            Размер
======================================================================================================================
Установка:
 bzr                             x86_64                 2.6.0-12.fc23                    fedora                 6.3 M
 libtomcrypt                     x86_64                 1.17-25.fc23                     fedora                 229 k
 libtommath                      x86_64                 0.42.0-6.fc23                    fedora                  39 k
 python-crypto                   x86_64                 2.6.1-7.fc23                     fedora                 468 k
 python-ecdsa                    noarch                 0.11-4.fc23                      fedora                  73 k
 python-paramiko                 noarch                 1.15.2-3.fc23                    fedora                 254 k

Результат операции
======================================================================================================================
Установка  6 Пакетов

Объем загрузки: 7.4 M
Объем изменений: 33 M
Продолжить? [д/Н]: y
Загрузка пакетов:
(1/6): python-paramiko-1.15.2-3.fc23.noarch.rpm                                       256 kB/s | 254 kB     00:00    
(2/6): python-crypto-2.6.1-7.fc23.x86_64.rpm                                          385 kB/s | 468 kB     00:01    
(3/6): python-ecdsa-0.11-4.fc23.noarch.rpm                                            223 kB/s |  73 kB     00:00    
(4/6): libtommath-0.42.0-6.fc23.x86_64.rpm                                            183 kB/s |  39 kB     00:00    
(5/6): libtomcrypt-1.17-25.fc23.x86_64.rpm                                            317 kB/s | 229 kB     00:00    
(6/6): bzr-2.6.0-12.fc23.x86_64.rpm                                                   633 kB/s | 6.3 MB     00:10    
----------------------------------------------------------------------------------------------------------------------
Общий размер                                                                          637 kB/s | 7.4 MB     00:11     
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно
Выполнение транзакции
  Установка    : libtommath-0.42.0-6.fc23.x86_64                                                                  1/6 
  Установка    : libtomcrypt-1.17-25.fc23.x86_64                                                                  2/6 
  Установка    : python-crypto-2.6.1-7.fc23.x86_64                                                                3/6 
  Установка    : python-ecdsa-0.11-4.fc23.noarch                                                                  4/6 
  Установка    : python-paramiko-1.15.2-3.fc23.noarch                                                             5/6 
  Установка    : bzr-2.6.0-12.fc23.x86_64                                                                         6/6 
  Проверка     : bzr-2.6.0-12.fc23.x86_64                                                                         1/6 
  Проверка     : python-paramiko-1.15.2-3.fc23.noarch                                                             2/6 
  Проверка     : python-crypto-2.6.1-7.fc23.x86_64                                                                3/6 
  Проверка     : python-ecdsa-0.11-4.fc23.noarch                                                                  4/6 
  Проверка     : libtomcrypt-1.17-25.fc23.x86_64                                                                  5/6 
  Проверка     : libtommath-0.42.0-6.fc23.x86_64                                                                  6/6 

Установлено:
  bzr.x86_64 2.6.0-12.fc23              libtomcrypt.x86_64 1.17-25.fc23     libtommath.x86_64 0.42.0-6.fc23         
  python-crypto.x86_64 2.6.1-7.fc23     python-ecdsa.noarch 0.11-4.fc23     python-paramiko.noarch 1.15.2-3.fc23    

Выполнено!
2. Загружаю сам проект gorun:

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

[olej@dell tasks]$ bzr branch lp:gorun
You have not informed bzr of your Launchpad ID, and you must do this to
write to Launchpad or access private data.  See "bzr help launchpad-login".
Ответвлены 19 ревизий.                                                                         

[olej@dell tasks]$ ls -l -R gorun
gorun:
итого 44
-rw-rw-r--. 1 olej olej 35147 май 31 15:24 COPYING
-rw-rw-r--. 1 olej olej  7597 май 31 15:24 gorun.go
3. Сборка

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

[olej@dell tasks]$ cd gorun
[olej@dell gorun]$ go build ./gorun.go 
[olej@dell gorun]$ ls -l gorun
-rwxr-xr-x. 1 olej olej 2871080 май 31 15:28 gorun
[olej@dell gorun]$ file gorun
gorun: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 15:56

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

[olej@dell gorun]$ sudo cp gorun /usr/local/bin
[sudo] пароль для olej: 
[olej@dell tasks]$ which gorun
/usr/local/bin/gorun
[olej@dell tasks]$ touch tiny.go
Тестовая задача:

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

[olej@dell tasks]$ cat tiny.go 
#!/usr/local/bin/gorun

package main
import ( "fmt" )

func main() {
   fmt.Println( "минимальное приложение" )
}

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

[olej@dell tasks]$ chmod a+x tiny.go 
[olej@dell tasks]$ time ./tiny.go 
go tool: no such tool "6g"
error: failed to run go: exit status 3
real	0m0.013s
user	0m0.010s
sys	0m0.006s
Вот так! :-o - то, что так успешно работало в полтора года назад - развалилось! :cry:
Не может быть вызван компилятор 6g по именам, унаследованным из ОС Plan 9:

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

        switch runtime.GOARCH {
        case "386":
                return "8"
        case "amd64":
                return "6"
        case "arm":
                return "5"
        }

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

Re: Go

Непрочитанное сообщение Olej » 31 май 2016, 16:47

Olej писал(а): 2. При некоторых условиях (опциями команд) сборка может быть динамическая, с использованием shared библиотек операционной системы:
С этими опциями я разберусь попозже.

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

[olej@dell ~]$ dnf info golang-shared
Последняя проверка окончания срока действия метаданных: 8 days, 17:14:54 назад, Sun May 22 23:18:30 2016.
Доступные пакеты
Имя         : golang-shared
Архитектура : x86_64
Эпоха       : 0
Версия      : 1.5.4
Релиз       : 1.fc23
Размер      : 12 M
Репозиторий : updates
Краткое опи : Golang shared object libraries
URL         : http://golang.org/
Лицензия    : BSD and Public Domain
Описание    : Golang shared object libraries.

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

[olej@dell ~]$ sudo dnf install golang-shared
[sudo] пароль для olej: 
Последняя проверка окончания срока действия метаданных: 1:35:29 назад, Tue May 31 14:58:30 2016.
Зависимости разрешены.
=====================================================================================================================================
 Package                            Архитектура                 Версия                            Репозиторий                  Размер
=====================================================================================================================================
Установка:
 golang-shared                      x86_64                      1.5.4-1.fc23                      updates                       12 M

Результат операции
=====================================================================================================================================
Установка  1 Пакет

Объем загрузки: 12 M
Объем изменений: 77 M
Продолжить? [д/Н]: y
Загрузка пакетов:
golang-shared-1.5.4-1.fc23.x86_64.rpm                                                                1.2 MB/s |  12 MB     00:10    
-------------------------------------------------------------------------------------------------------------------------------------
Общий размер                                                                                         1.1 MB/s |  12 MB     00:11     
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно
Выполнение транзакции
  Установка    : golang-shared-1.5.4-1.fc23.x86_64                                                                               1/1 
  Проверка     : golang-shared-1.5.4-1.fc23.x86_64                                                                               1/1 

Установлено:
  golang-shared.x86_64 1.5.4-1.fc23                                                                                                  

Выполнено!
Делаем 2 параллельных сборки:

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

[olej@dell tasks]$ go build -linkshared ./hello.go 
[olej@dell tasks]$ go build -o hellos ./hello.go 
[olej@dell tasks]$ ls -l hello*
-rwxr-xr-x. 1 olej olej   15816 май 31 16:38 hello
-rw-rw-r--. 1 olej olej     266 май 31 11:05 hello.go
-rwxr-xr-x. 1 olej olej 2367424 май 31 16:38 hellos
[olej@dell tasks]$ ./hello
Hello, 世界
[olej@dell tasks]$ ./hellos
Hello, 世界
[olej@dell tasks]$ file hello*
hello:    ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=ecbaadbe3483b60da122274f34abadf78d68b236, not stripped
hello.go: C source, UTF-8 Unicode text
hellos:   ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Размеры приложений, собранных из одного исходника, отличаются больше чем в 100 раз:

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

[olej@dell tasks]$ ldd hello
	linux-vdso.so.1 (0x00007ffe5fbf4000)
	libstd.so => /usr/lib/golang/pkg/linux_amd64_dynlink/libstd.so (0x00007f8bfbd9b000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f8bfb9bc000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8bfb79f000)
	/lib64/ld-linux-x86-64.so.2 (0x000056212c4b6000)
[olej@dell tasks]$ ldd hellos
	не является динамическим исполняемым файлом

Ответить

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

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

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