m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

golangのv1.16の開発環境を準備する

いつの間にか

v.1.16まで上がっていた、なんか以前とパッケージの扱い? とか変わっているので少し見直し

なんかgo modulesとかいうのがあるらしい

当時は各モジュールの最新バージョンが適用されやすくなっていて 新しい環境でビルドした際にコンパイルエラーとなっていたことがある。 多分、revelとか・・・

そのため、バージョンを固定にして対応していた このgo modulesを使用するとバージョンを各プロジェクト毎に管理できるらしく、 ちょっと楽になるらしい

参考情報

Goのプロジェクト構成の基本

Go のモジュール管理【バージョン 1.16 改訂版】

ローカル環境のみでの Go Modules と自作パッケージ - Qiita

WindowsにGo言語開発環境をインストールする - Qiita

goの再インストールから

インストール

% brew install go
% go version
go version go1.16.3 darwin/amd64
%

GOPATH設定

srcは管理されなくなったような気がするが、pkgとbinは使われているみたい

GOPATH用準備

% mkdir -p $HOME/work/go/{src,pkg,bin}
% export GOPATH=$HOME/work/go

サンプルプロジェクト

ディレクトリ作成

% mkdir -p $HOME/work/golang/sample1
% cd $HOME/work/golang/sample1

go modules初期化

% go mod init sample1
go: creating new go.mod: module sample1
%

※モジュール名はローカルならプロジェクト名で良い、githubmなどに公開する場合はgithub/xxxxとかにしないといけない

go.modの中身

% cat go.mod
module sample1

go 1.16
%

なんかパッケージを入れてみる

% go get github.com/labstack/echo/v4
go: downloading github.com/labstack/echo v1.4.4
go: downloading github.com/labstack/echo/v4 v4.2.2
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: downloading github.com/labstack/gommon v0.3.0
go: downloading golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
go: downloading golang.org/x/net v0.0.0-20200822124328-c89045814202
go: downloading github.com/mattn/go-colorable v0.1.7
go: downloading github.com/mattn/go-isatty v0.0.12
go: downloading github.com/valyala/fasttemplate v1.2.1
go: downloading golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: downloading golang.org/x/text v0.3.3
go get: added github.com/labstack/echo/v4 v4.2.2
%

% cat go.mod
module sample1

go 1.16

require github.com/labstack/echo/v4 v4.2.2 // indirect
%

直接、go.modに編集しても良いらしい

サンプルコード

sample1.go

package main

import (
    "fmt"

    echo "github.com/labstack/echo/v4"

    "sample1/src/car"
)

func main() {
    fmt.Println("aaa")
    fmt.Println(echo.Version)

    a := new(car.Car)
    a.Init()
    a.Msg()

}

src/car/car.go

package car

import "fmt"

type Car struct {
    name string
}

func (p *Car) Msg() {
    fmt.Println(p.name)
}

func (p *Car) Init() {
    p.name = "くるま"
}

以前はローカル環境の場合は相対パスでも動いていた気がしますが、 go modulesの場合はNGになったかもしれない

ディレクトリ構成

% tree
.
├── go.mod
├── go.sum
├── sample1.go
├── src
├   └── car
├       └── car.go
└── workspace.code-workspace

おまけ

vscode設定(setting.json

"settings": {
    "go.gopath": "/Users/xxxx/work/go",  ⇦ GOPATHの場所
    "go.formatOnSave": true, 
    "go.goroot": "/usr/local/Cellar/go/1.16.3/libexec" ⇦ GOROOTの場所
}

初回にデバッグ用ツールが入っていない場合はインストールするので定義した方が良い goparthを定義しないとデフォルトのGOPATHの場所になるので注意