Go: модули

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

Модератор: Olej

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

Go: модули

Непрочитанное сообщение Olej » 12 мар 2023, 01:04

Это ещё одно новшество (относительное) Go, появившееся с версии 1.11 - модули и поддержка версионности.

В экосистеме GoLang создано и нарабатывается множество сторонних пакетов, пригодных для свободного и всестороннего использования. Они, главным образом, располагаются в сетевых репозиториях, о которых упоминалось выше. Но с некоторых пор (из-за такого обилия во многом), для поддержания всего этого хозяйстве потребовалась система поддержания версионности.

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

Go: модули

Непрочитанное сообщение Olej » 12 мар 2023, 01:35

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

Попробуем скомпилировать:

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go build max.go 
max.go:4:8: no required module provides package golang.org/x/exp/constraints: go.mod file not found in current directory or any parent directory; see 'go help modules'
Этот номер прошёл бы с компилятором версии до 1.11, до введения модулей Go.
Это потому, что этот код хочет импортировать пакет из сетевого репозитория constraints:

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ grep import max.go
import "fmt"
import "golang.org/x/exp/constraints"
Но теперь импорт возможен только между согласованными версиями (компилятора и пакетов)!
У нас компилятор (и вся соответствующая инфраструктура GoLang):

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

olej@R420:~$ go version
go version go1.20rc2 linux/amd64
Теперь для импорта из сетевого репозитория я должен создать файл описания модуля ... Выполним (с произвольным именем модуля generic — пусть он у нас просто совпадает с именем каталога):

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go mod init generic
go: creating new go.mod: module generic
go: to add module requirements and sums:
    go mod tidy
После чего у нас появится новый файл, пока только такого содержания:

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ cat go.mod
module generic
go 1.20
Пока он определяет только версию компилирующей системы, для которой предназначен пакет. И если пакет (или ни один пакет в этом каталоге) не требует пакетов из сетевых репозиториев, то условия (безошибочность) компиляции не изменятся.

И снова пробуем компиляцию:

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go build max.go 
max.go:4:8: no required module provides package golang.org/x/exp/constraints; to add it:
	go get golang.org/x/exp/constraints
Т.е. подсказка (ошибки) говорит как сделать загрузкуимпорта:

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go get golang.org/x/exp/constraints
go: downloading golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
go: added golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
Но проще и лучше (и я думаю что правильнее … и тем более разобраться что же происходит) сразу после инициализации файла go.mod (как это показано выше командой: go mod init ...) выполнить рекомендуемое там же действие вот такой командой:

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ go mod tidy
go: finding module for package golang.org/x/exp/constraints
go: found golang.org/x/exp/constraints in golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
Эта команда проанализировала списки импорта текущего пакета, и подготовила (загрузила) все требуемые зависимости в нужной (адекватной пакету!) версии. В итоге чего:

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ ls -l go.*
-rw-rw-r-- 1 olej olej  85 мар 11 15:34 go.mod
-rw-rw-r-- 1 olej olej 207 мар 11 15:34 go.sum

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

olej@R420:~/2023/own.BOOKs/BHV.Go.2/examples/generic$ cat go.mod
module generic
go 1.20
require golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0
Содержимое go.mod (как мы видим) изменилось, добавилось.

Но это не всё! Произошла загрузка требуемых пакетов для импорта, которые мы находим здесь ... выполнив из любого каталога файловой системы:

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

olej@R420:~/2023/own.BOOKs$ go env GOPATH
/home/olej/go

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

olej@R420:~/2023/own.BOOKs$ ls `go env GOPATH`/pkg/mod/golang.org/x/exp@v0.0.0-20230310171629-522b1b587ee0  -w80
apidiff         CONTRIBUTING.md  go.mod   LICENSE  rand       slog
cmd             devtools         go.sum   maps     README.md  utf8string
codereview.cfg  ebnf             inotify  mmap     shootout
constraints     ebnflint         io       PATENTS  slices

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

olej@R420:~/2023/own.BOOKs$ tree `go env GOPATH`/pkg/mod/golang.org/x/exp@v0.0.0-20230310171629-522b1b587ee0/constraints 
/home/olej/go/pkg/mod/golang.org/x/exp@v0.0.0-20230310171629-522b1b587ee0/constraints
├── constraints.go
└── constraints_test.go

0 directories, 2 files
И вот (только) теперь пакет, требующий импорта из сети, замечательно компилируется:

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

$ go build max.go 

$ ls -l max
-rwxrwxr-x 1 olej olej 1839159 мар 11 16:17 max

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

Go: модули

Непрочитанное сообщение Olej » 12 мар 2023, 13:42

Olej писал(а):
12 мар 2023, 01:04
Это ещё одно новшество (относительное) Go, появившееся с версии 1.11 - модули и поддержка версионности.
То что достаточно любопытно знать относительно модулей Go:

Введение в систему модулей Go
27 авг 2018
Введение в модули
03.12.2021

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

Go: модули

Непрочитанное сообщение Olej » 08 фев 2024, 23:26

По поводу модулей Go нужно поговорить подробнее ... Потому что это сейчас становится основным tools в Go :!:
1). потому что это теперь нужно будет почти в люьом проекте...
2). потому что это очень просто, если знать как...
Добавляю в код своего проекта:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ head -n6 errgrp.go
package main
import (
    "os"
    "fmt"
    "golang.org/x/sync/errgroup"
)
Т.е. импорт из сетевого репозитория.
И при сборке получу ошибку!

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go build errgrp.go
errgrp.go:5:2: no required module provides package golang.org/x/sync/errgroup; to add it:
    go get golang.org/x/sync/errgroup
Нужно добавить (в каталог) описание модуля ... но сделать это не вручную:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod init errgrp
go: creating new go.mod: module errgrp
go: to add module requirements and sums:
    go mod tidy

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ ls -oh | grep  ^-rw
-rw-rw-r-- 1 olej 1,3K фев  7 14:25 errgrp.go
-rw-rw-r-- 1 olej 2,0K фев  7 14:40 errgrp.hist
-rw-rw-r-- 1 olej   25 фев  7 14:42 go.mod
-rw-r--r-- 1 olej  276 фев  7 14:33 Makefile

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp

go 1.21.3
Пока у меня тут только название модуля и версия Go для которой...

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

Go: модули

Непрочитанное сообщение Olej » 08 фев 2024, 23:33

Olej писал(а):
08 фев 2024, 23:26
Т.е. импорт из сетевого репозитория.
И при сборке получу ошибку!
Теперь к ошибке сетевого импорта...
Тут можно поступить 2-мя способами:
1). конкретно указать (что откуда импортируется):

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go get golang.org/x/sync/errgroup
go: downloading golang.org/x/sync v0.6.0
go: added golang.org/x/sync v0.6.0
И получим:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp

go 1.21.3

require golang.org/x/sync v0.6.0 // indirect
Происходит загрузка из сети. И всё станет собираться...
2). И это лучше :!: Поручить самому GoLang разобраться что и откуда нужно импортировать:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy
Эта команда неизменная :!: В неё не включаются имена модуля, пакетов, URL, или файлов...
После этого (небольшие отличия):

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp

go 1.21.3

require golang.org/x/sync v0.6.0

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ ls -oh | grep  ^-rw
-rw-rw-r-- 1 olej 1,4K фев  7 14:57 errgrp.go
-rw-rw-r-- 1 olej 5,1K фев  7 14:56 errgrp.hist
-rw-rw-r-- 1 olej   59 фев  7 14:55 go.mod
-rw-rw-r-- 1 olej  153 фев  7 14:48 go.sum
-rw-r--r-- 1 olej  276 фев  7 14:33 Makefile

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.sum
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=

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

Go: модули

Непрочитанное сообщение Olej » 08 фев 2024, 23:39

Собственно, вся загрузка импорта происходит сюда:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go env GOPATH
/home/olej/go

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ ls -o `go env GOPATH`/pkg/mod/golang.org/x/ | grep sync
dr-xr-xr-x  6 olej 4096 июн  1  2023 sync@v0.0.0-20210220032951-036812b2e83c
dr-xr-xr-x  6 olej 4096 фев  7 14:48 sync@v0.6.0
Тут любопытно, что sync@... - 2 шт., что видно и из go.sum (выше) ... , но один из них загружен 1 июня 2023г., а другой, версии 0.6.6 - вчера, 7 февраля 2024.
Так работает управление версиями.

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ tree `go env GOPATH`/pkg/mod/golang.org/x/sync@v0.6.0
/home/olej/go/pkg/mod/golang.org/x/sync@v0.6.0
├── codereview.cfg
├── CONTRIBUTING.md
├── errgroup
│   ├── errgroup_example_md5all_test.go
│   ├── errgroup.go
│   ├── errgroup_test.go
│   ├── go120.go
│   ├── go120_test.go
│   └── pre_go120.go
├── go.mod
├── LICENSE
├── PATENTS
├── README.md
├── semaphore
│   ├── semaphore_bench_test.go
│   ├── semaphore_example_test.go
│   ├── semaphore.go
│   └── semaphore_test.go
├── singleflight
│   ├── singleflight.go
│   └── singleflight_test.go
└── syncmap
    ├── map_bench_test.go
    ├── map.go
    ├── map_reference_test.go
    └── map_test.go

4 directories, 22 files

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

olej@R420:~/go/pkg/mod/golang.org/x$ pwd
/home/olej/go/pkg/mod/golang.org/x

olej@R420:~/go/pkg/mod/golang.org/x$ ls -o
итого 140
dr-xr-xr-x 33 olej 4096 мая 31  2023 crypto@v0.0.0-20191011191535-87dc89f01550
dr-xr-xr-x 34 olej 4096 июн  1  2023 crypto@v0.0.0-20210513164829-c07d793c2f9a
dr-xr-xr-x 34 olej 4096 апр 16  2023 crypto@v0.0.0-20221012134737-56aed061732a
dr-xr-xr-x 34 olej 4096 апр 16  2023 crypto@v0.1.0
dr-xr-xr-x 34 olej 4096 июн 29  2023 crypto@v0.8.0
dr-xr-xr-x 15 olej 4096 июн  1  2023 exp@v0.0.0-20200224162631-6cc2880d07d6
dr-xr-xr-x 18 olej 4096 мая 10  2022 exp@v0.0.0-20220428152302-39d4317da171
dr-xr-xr-x 17 olej 4096 июн 29  2023 exp@v0.0.0-20221205204356-47842c84f3db
dr-xr-xr-x 17 olej 4096 апр 16  2023 exp@v0.0.0-20221217163422-3c43f8badb15
dr-xr-xr-x 17 olej 4096 мар 11  2023 exp@v0.0.0-20230310171629-522b1b587ee0
dr-xr-xr-x 17 olej 4096 июн  1  2023 image@v0.0.0-20190802002840-cff245a6509b
dr-xr-xr-x  5 olej 4096 июн  1  2023 lint@v0.0.0-20210508222113-6edffad5e616
dr-xr-xr-x 14 olej 4096 июн  1  2023 mobile@v0.0.0-20190719004257-d2bd2a29d028
dr-xr-xr-x  9 olej 4096 июн  1  2023 mod@v0.4.2
dr-xr-xr-x 24 olej 4096 мая 31  2023 net@v0.0.0-20190923162816-aa69164e4478
dr-xr-xr-x 24 olej 4096 июн  1  2023 net@v0.0.0-20210614182718-04defd469f4e
dr-xr-xr-x 24 olej 4096 апр 16  2023 net@v0.0.0-20221014081412-f15817d10f9b
dr-xr-xr-x 24 olej 4096 апр 16  2023 net@v0.7.0
dr-xr-xr-x 24 olej 4096 июн 29  2023 net@v0.9.0
dr-xr-xr-x 38 olej 4096 июн  1  2023 oauth2@v0.0.0-20210819190943-2bc19b11175f
dr-xr-xr-x  6 olej 4096 июн  1  2023 sync@v0.0.0-20210220032951-036812b2e83c
dr-xr-xr-x  6 olej 4096 фев  7 14:48 sync@v0.6.0
dr-xr-xr-x  6 olej 4096 мая 31  2023 sys@v0.0.0-20190924154521-2837fb4f24fe
dr-xr-xr-x  8 olej 4096 июн  1  2023 sys@v0.0.0-20210917161153-d61c044b1678
dr-xr-xr-x  8 olej 4096 апр 16  2023 sys@v0.0.0-20221013171732-95e765b1cc43
dr-xr-xr-x  8 olej 4096 апр 16  2023 sys@v0.5.0
dr-xr-xr-x  8 olej 4096 июн 29  2023 sys@v0.7.0
dr-xr-xr-x  2 olej 4096 июн  1  2023 term@v0.0.0-20210220032956-6a3ed077a48d
dr-xr-xr-x 19 olej 4096 июн  1  2023 text@v0.3.6
dr-xr-xr-x 19 olej 4096 апр 16  2023 text@v0.3.8
dr-xr-xr-x 19 olej 4096 апр 16  2023 text@v0.7.0
dr-xr-xr-x 19 olej 4096 июн 29  2023 text@v0.9.0
dr-xr-xr-x  3 olej 4096 июн  1  2023 time@v0.0.0-20210723032227-1f47c861a9ac
dr-xr-xr-x 16 olej 4096 июн  1  2023 tools@v0.1.5
dr-xr-xr-x  3 olej 4096 июн  1  2023 xerrors@v0.0.0-20200804184101-5ec99f83aff1

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

Go: модули

Непрочитанное сообщение Olej » 09 фев 2024, 00:09

Olej писал(а):
08 фев 2024, 23:39
Так работает управление версиями.
Но это ещё не всё... :lol:
Собрался импортировать и дописал в *.go код:

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

import "github.com/hajimehoshi/ebiten"
И дальше по схеме...

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy
go: finding module for package github.com/hajimehoshi/ebiten
go: downloading github.com/hajimehoshi/ebiten v1.12.12
go: found github.com/hajimehoshi/ebiten in github.com/hajimehoshi/ebiten v1.12.12
go: downloading golang.org/x/sys v0.0.0-20200918174421-af09f7315aff
go: downloading github.com/gofrs/flock v0.8.0
go: downloading golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f
go: downloading github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2
go: downloading golang.org/x/image v0.0.0-20200801110659-972c09e46d76
go: downloading golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp

go 1.21.3

require (
    github.com/hajimehoshi/ebiten v1.12.12
    golang.org/x/sync v0.6.0
)

require (
    github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200707082815-5321531c36a2 // indirect
    golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56 // indirect
    golang.org/x/image v0.0.0-20200801110659-972c09e46d76 // indirect
    golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect
    golang.org/x/sys v0.0.0-20200918174421-af09f7315aff // indirect
)
А потом оказывается, что мне нужен (лучше) не этот модуль, а другой...
А я уже наимпортировал того что не надо :!: :cry:
Делаем:
Сначала я просто убираю строку ненужного мне импорта (проверить что будет):

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp

go 1.21.3

require golang.org/x/sync v0.6.0
Вот так :!:
Он перетёр ненужный импорт :!: :idea:
Вписываю новый импорт в *.go:

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

import "github.com/eiannone/keyboard"

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go build contextc.go
contextc.go:9:5: no required module provides package github.com/eiannone/keyboard; to add it:
    go get github.com/eiannone/keyboard

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go mod tidy
go: finding module for package github.com/eiannone/keyboard
go: downloading github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
go: found github.com/eiannone/keyboard in github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
go: downloading golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a

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

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ cat go.mod
module errgrp

go 1.21.3

require (
    github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203
    golang.org/x/sync v0.6.0
)
    
require golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
Самое то что надо :idea:

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

Go: модули

Непрочитанное сообщение Olej » 10 фев 2024, 17:24

Olej писал(а):
08 фев 2024, 23:39
Так работает управление версиями.
А что делать с go.mod при изменении версии GoLAng? ... особенно в сторону уменьшения: 1.22 -> 1.18 (например для проверки совместимости).
Ведь весь импорт для текущей версии (Go, модулей используемых...) - посыпался :!: :cry:
Опыт показал (может есть другой способ):
- полностью удалить go.mod ...
- пересоздать его заново ... (проделать импорт где нужно, где уже делался - сам подхватит...)

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

$ go mod init <имя_модуля>
$ $ go mod tidy
Этого оказывается достаточно :!:
См. подробно: Go: инструментарий (продолжение).

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

Go: модули

Непрочитанное сообщение Olej » 10 фев 2024, 17:58

Для проверки приоритетов операций в Go ... ну и других дел :lol: - задумалось сделать CLI калькулятор: ты ему вводишь арифметическое выражение (строку), а он тебе - результат его вычисления. Это 1-е условие...
А 2-е условие ... не писать свой калькулятор и для каждой операции код - как великое множество в Интернет "ручных" реализаций, на многие десятки, а то и сотни строк, как вот, например: Язык Go. Консольный калькулятор (и таких великое множество), а найти в репозиториях GoLang и импортировать модуль/пакет, который реализует метод Eval() (по аналогии с Lisp или Python).
Сказано - сделано... :lol:
Поиском на https://pkg.go.dev/ по контексту "math eval" (https://pkg.go.dev/search?q=math+eval&m=package) нахожу (из нескольких):
meval (github.com/gSpera/meval)
Package Math Eval implements a math evaluator.
Imported by 1 | v0.1.1 published on Nov 16, 2019 | MIT
Math Evaluator
Math Eval is Yet Another Math Evaluator. for using eval is necessary to create an Evaluator with e := meval.New(). An evaluator contains the variables and the functions e.SetVar("x", 42). For evaluating expressions use the Eval method e.Eval("x+2").
Обычно даже такого краткого описания пакетов достаточно чтобы начать их использовать...

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

Go: модули

Непрочитанное сообщение Olej » 10 фев 2024, 18:03

Olej писал(а):
10 фев 2024, 17:58
Обычно даже такого краткого описания пакетов достаточно чтобы начать их использовать...
1. Быстренько проверив пакет на показанных Examples... (обязательно на пригодность своим целям :!: )
2. Набрасываю себе код:

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

package main

import (
    "os"
    "io"
    "bufio"
    "fmt"
    "strings"
    "github.com/gSpera/meval"
)

func main() {
    e := meval.New()
	e.SetFn("sum", sum)
    r := bufio.NewReader(os.Stdin)    
	for {
        print("? ")
		str, err := r.ReadString('\n')
        if err == io.EOF { 
            println()               // ^D
            break 
        }
		if err != nil {
            fmt.Printf("%v\n", err)
			panic(err)
		}
        str = strings.TrimRight(str, " \n")
        if 0 == len(str) { break; } // Enter
        print(str, " = ")
        value, err := e.Eval(str)
        if err == nil {
            fmt.Printf("%v\n", value)
        } else {
            fmt.Printf("ошибочное выражение: %v\n", err)
        }    
    }
}

var	sum = func(args ...float64) (float64, error) {
	var sum float64
	for _, arg := range args {
		sum += arg
	}
	return sum, nil
}

var	prod = func(args ...float64) (float64, error) {
	var prod float64 = 1.0
	for _, arg := range args {
		prod *= arg
	}
	return prod, nil
}
Естественно:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ go build math.eval.go
math.eval.go:6:5: no required module provides package github.com/gSpera/meval; to add it:
    go get github.com/gSpera/meval
... требует импорта ...
Что решается:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ go mod tidy
go: finding module for package github.com/gSpera/meval
go: downloading github.com/gSpera/meval v0.1.1
go: found github.com/gSpera/meval in github.com/gSpera/meval v0.1.1
В итоге:

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

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ go build math.eval.go

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

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/types$ ls -o math.eval*
-rwxrwxr-x 1 olej 2558703 фев 10 17:03 math.eval
-rw-rw-r-- 1 olej    1035 фев 10 16:44 math.eval.go
Вложения
math.eval.go
(1.01 КБ) 5 скачиваний

Ответить

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

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

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