Basic

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

$ mkdir project
$ cd project
$ go mod init project

Или

$ go mod init github.com/IkeMurami/test-go-project
$ cat go.mod

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

Π―Π·Ρ‹ΠΊ Go ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² , Π° Π½Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° любоС количСство Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈ Ссли всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ объявлСниС ΠΏΠ°ΠΊΠ΅Ρ‚Π°, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния языка Go всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ частями ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ всС ΠΈΡ… содСрТимоС Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π² СдинствСнном Ρ„Π°ΠΉΠ»Π΅.

Package β€” Π½Π°Π±ΠΎΡ€ скриптов ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², находящихся Π² ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈΠ»ΠΈ отнСсСнных ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ package (Π² ΠΎΠ΄Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²). ВсС классы, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‚ΠΈΠΏΡ‹ ΠΈ Ρ‚ΠΏ Π²ΠΈΠ΄Π½Ρ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Go ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹.

Module β€” коллСкция ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ состоят ΠΈΠ· ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ находящийся Π² ΠΊΠΎΡ€Π½Π΅ (/) рСпозитория). Π€Π°ΠΉΠ» go.mod опрСдСляСт module path β€” import path prefix для всСх ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля.

package/
    mod1/
        go.mod
    mod2/
        go.mod
    ...
    
ΠΈΠ»ΠΈ

package/
    go.mod

Π§Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² Go-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅

package/
    vendor/ β€” сюда Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ зависимости
    tests/ β€” для тСстов
    tools/ - для ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ
        tools.go - инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π½Π° этапС сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
        generate.go - кодогСнСрация (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, protobuf'Ρ‹)
    configs/ β€” для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ²
    cmd/ β€” для ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСтся Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ ΡΡ‚Ρ€ΠΎΠΊΡƒΡŽ. Π“Ρ€ΡƒΠ±ΠΎ говоря для Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ²
    pkg/ β€” для всСго ΠΊΠΎΠ΄Π° (Π² Ρ‚ΠΎΠΌ числС ΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ экспортируСмый)
    internal/ β€” ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π΅ позволяСм ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: https://golang.org/cmd/go/#hdr-Internal_Directories
    build/ β€” для Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ всСго, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Π±ΠΈΠ»Π΄Π°
        migrations/ β€” для ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ с вСрсии Π½Π° Π²Π΅Ρ€ΡΠΈΡŽ Π±Π°Π·
        package/ β€” для сборки ΠΏΠ°ΠΊΠ΅Ρ‚Π°
    bin/ β€” ΠΊΡƒΠ΄Π° Π±ΠΈΠ½Π°Ρ€ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠ»Π°ΡΡ‚ΡŒΡΡ собранныС
    service/ β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ сСрвисам (kafka, rabbit, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ сСрвис)
    .gitignore β€” Ρ‡Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€)
    .dockerignore β€” Ρ‡Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€)
    README.md β€” описаниС
    Makefile
    ...
    Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ci ΡˆΡ‚ΡƒΠΊΠΈ

Π Π°Π±ΠΎΡ‚Π° с зависимостями

go.mod

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ go.mod Ρ„Π°ΠΉΠ». Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ ваш ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½. Π’Π°ΠΊ ΠΆΠ΅ этот Ρ„Π°ΠΉΠ» Ρ…Ρ€Π°Π½ΠΈΡ‚ зависимости.

go mod init <project-name>

НапримСр:
go mod init test_project
go mod init mysite.com/project-name
go mod init github.com/tests/ttests

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ зависимости

Допустим, Ρ‡Ρ‚ΠΎ Π²Ρ‹ (main_project) ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ локального ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (test_project), Ρ‚ΠΎΠ³Π΄Π° Π² go.mod добавляСм строчку:

module main_project

go 1.14

replace mysite.com/test_project => ../test_project

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π½Π΅ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Или Ρ‚ΠΎ ΠΆΠ΅, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ go mod:

$ go mod edit -replace github.com/pselle/bar=/Users/pselle/Projects/bar

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй

ПослС создания go.mod (-u ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ Π² GOPATH, Π° локально):

$ go get -u golang.org/x/lint/golint

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΎΡ‚ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

ΠŸΠ΅Ρ€Π΅Π΄ созданиСм Ρ€Π΅Π»ΠΈΠ·Π° рСкомСндуСтся ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚ Π»ΠΈΡˆΠ½ΠΈΡ… зависимостСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ

$ go mod tidy
$ cat go.mod

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

gc - стандартный компилятор языка Go. Π’ Π΅Π³ΠΎ состав входят:

  • ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ компиляции 5g, 6g ΠΈ 8g

  • ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ 51, 61 ΠΈ 81

  • godoc β€” для просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ

5 β€” ARM 6 β€” AMD64 8 β€” Intel 386

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° высокоуровнСвая ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° β€” go.

Π’ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ Go Π²Ρ…ΠΎΠ΄ΠΈΡ‚ инструмСнт cgo, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования внСшнСго ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° C Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° языкС Go. Π’ Linux ΠΈ BSD-систСмах имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° C ΠΈ C++ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнта SWIG (www.swig.org). Помимо gc, имССтся Ρ‚Π°ΠΊΠΆΠ΅ компилятор gccgo (интСрфСйс ΠΊ компилятора gcc β€” GNU Compiler Collection β€” для языка Go).

ΠŸΡ€Π°Π²ΠΊΠ°, компиляция ΠΈ запуск

Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€ΡŒ рядом:
$ go build [-o /path/to/binary]

ΠΏΡ€ΠΎ кросс-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ: https://habr.com/ru/post/249449/

ΠΏΡ€ΠΈΠΌΠ΅Ρ€: win:
GOOS=windows GOARCH=386 go build -o http_example.exe
GOOS=windows GOARCH=amd64 go build -o http_example64.exe

Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€ΡŒ Π² %GOROOT%\bin:
$ go install

go cmd

ДокумСнтация ΠΏΠΎ go cli: https://pkg.go.dev/cmd/go

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инструмСнты

tools.go

НС знаю для Ρ‡Π΅Π³ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для сборки Π±ΠΈΠ½Π°Ρ€Π΅ΠΉ/инструмСнтов.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

// +build tools

package main

import (
	_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2"
)

// +build tools β€” build constraint a.k.a. build tag

ΠšΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡ

Π•ΡΡ‚ΡŒ такая инструкция go generate. Она позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π΄ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (go build). НапримСр, Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ bash-скрипт, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ для proto-структур ΠΈ классов, Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ dev-зависимости...

Как Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ это Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ рядом с main.go, Ρ„Π°ΠΉΠ» generate.go:

package main

//go:generate scripts/protobuf.sh
//go:generate go install github.com/some/package
//go:generate protoc -I=. --go_out=. --go_opt=paths=source_relative ./protocol/some.proto

На этапС сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (Π΄ΠΎ go build) скрипт generate.go Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°

gofmt -w test.go
go fmt /path/to/project

Last updated