Golang
日本のGophers代表? 解説記事がある
メルカリ(プログラミング言語Go完全入門)
コードの長さ
Goは冗長な書き方となる。しかしそれがデメリットとはならない。
初心者でも導入がしやすいと裏付けられる。
Goよりもコードの密度が高く、より短く書けるプログラミング言語はある。
RubyやPythonであればコードの行数は半分から1/3になる。
Go実行速度
Goは実行速度では遅いが、コンパイルが圧倒的に早くネットワークなどのI/O速度が支配的なネットワークアプリケーションやコンテナーで動作するアプリケーションであれば十分な速度が出せる。
Goのモジュール管理
$ go env
# 1.16からGO111MODULE未指定時の規定値が`on`になった(そのためモジュールモードでやっている)
GO111MODULE=""
GOPATH モードとモジュール対応モード
Go のモジュール管理
バージョン 1.11
以降からGoツールーチェーンは以下の2つのモードのどちらかで動作する。
- GOPATHモード(GOPATH mode)
- バージョン
1.10
までのモード。標準ライブラリを除くすべてのパッケージのコード管理とビルドを環境変数GOPATHで指定されたディレクトリ下で行う。パッケージの管理はリポジトリの最新リビジョンのみが対象となる
- バージョン
- モジュール対応モード(module-aware mode)
- 標準ライブラリを除くすべてのパッケージをモジュールとして管理する。コード管理とビルドは任意のディレクトリで可能で、モジュールはリポジトリのバージョンタグまたはリビジョン毎に管理される
モジュールとは
モジュール対 応モードでは、標準ライブラリを除くパッケージをモジュールとして管理する。
パッケージが単一のディレクトリを指すのに対し、モジュールは go.mod
ファルのあるディレクトリ以下の(go.modは含まない)すべてのパッケージがモジュールの配下となる。
go.sum
SHA-256
チェックサム
SHA-256
チェックサムは、データの整合性を確認するために使用されるハッシュ関数の出力。
SHA-256は「Secure Hash Algorithm 256-bit」という意味で、256ビット(32バイト)のハッシュ値を生成する。
このハッシュ値は、ファイルやデータの内容が変更されていないかどうかを確認するのに役立つ。
SHA-256 チェックサムの仕組み
- ハッシュ関数: SHA-256はハッシュ関数の一種で、任意の長さのデータを取り、固定長のハッシュ値(この場合は256ビット)を出力する
- 一意性: 同じ入力データに対して は常に同じハッシュ値が生成されます。しかし、わずかでも入力データが変わると、ハッシュ値はまったく異なるものになります。
- 逆変換不可能: ハッシュ値から元のデータを復元することは計算上非実用的です。
go.sum
ファイルにおける SHA-256 チェックサムの役割
Go言語のモジュールシステムでは、go.sum
ファイルに各依存関係のSHA-256チェックサムを記録します。これは以下の理由で重要です:
- 整合性の検証:
go.sum
ファイルに記録されたハッシュ値を使用して、依存関係のファイルが変更されていないことを確認します。これにより、ソースコードが意図せず変更されたり、悪意のあるコードが注入されたりするリスクを軽減できます。 - セキュリティ: チェックサムによって、依存関係のファイルが配信元からダウンロードされた後に変更されていないことが保証されます。これはとくにオープンソースの依存関係を使用する場合に重要です。
- 再現可能なビルド:
go.sum
に記録されたチェックサムにより、プロジェクトが依存するモジュールの正確なバージョンを保証できます。これにより、異なる環境で同じビルド結果を再現できるようになりま す。 要するに、go.sum
ファイルに記録されたSHA-256チェックサムは、Goプロジェクトの依存関係のセキュリティと整合性を保証するための重要な機構です。これにより、開発者は依存関係が安全で、変更されていないことに確信を持ってコードを書くことができます。
go コマンド
パッケージをインストールするとgo.modおよびgo.sumに情報が反映される。 go getやgo mod tidyによってインストールされたパッケージは$GOPATH/pkg/modに保存される。
go get [パッケージ名] # 指定したパッケージのインストール
go get # importに記載されたパッケージのインストール
go mod tidy # importに記載されたパッケージのインストール。不要なパッケージの削除
パッケージのインストールが必要なGoファイルを実行する場合、Go 1.16では go mod tidy
or go get
⇨go build
という手順。
go get オプション
go mod tidy, go get, go install違い
go mod tidy
、go install
、go get
は、Goプログラミングにおける依存関係の管理やパッケージの取得に使用されるコマンド
-
go mod tidy
:go mod tidy
コマンドは、Goモジュールの依存関係を整理するためのコマンドです。- プロジェクトの
go.mod
ファイルに記載されている依存関係を解決し、不要な依存関係を削除します。 - 使用されていないモジュールがある場合は削除し、モジュールのバージョンを最新に更新します。
- プロジェクトの依存関係を最新の状態に保つことができます。
-
go install
:go install
コマンドは、Goプログラムをビルドして実行可能なバイナリファイルを作成し、指定されたパッケージをインストールします。- ソースコードをビルドして実行ファイルを生成し、その実行ファイルを
$GOPATH/bin
に配置します。 - インストールされた実行ファイルは、コマンドラインから直接実行できる。
go install
を使用することで、自作のパッケージやツールを利用する他のプロジェクトから利用できる。
-
go get
:go get
コマンドは、指定したパッケージを取得し、依存関係を解決してインストールするためのコマンドです。go get
を使用することで、公開されているパッケージやモジュールを取得し、ローカルにダウンロードします。- インストールされたパッケージは、他のプロジェクトで
import
文を使用して利用できる。
メリットとしては、以下のような特徴があります:
-
go mod tidy
:- 不要な依存関係を削除してプロジェクトのモジュールを整理できます。
- モ ジュールのバージョンを最新の状態に保つことで、セキュリティの問題やバグの修正などの改善を取り入れることができます。
-
go install
:- 自作のパッケージやツールを他のプロジェクトから利用できるようになります。
- ビルドされた実行
ファイルを容易に実行できます。
go get
:- 公開されているパッケージやモジュールを簡単に取得できます。
- 依存関係の解決やインストール作業が自動的に行われます。
これらのコマンドを適切に使用することで、Goプロジェクトの依存関係を管理し、必要なパッケージやモジュールを取得して開発を行うことができます。
Go モジュール・パッケージ
Goのアプリケーションとライブラリは、それぞれモジュールと呼ばれる塊になっている。 1つのフォルダーが1つのモジュールとなる。
実行ファイルorライブラリでもまず次のコマンドを叩いてプロジェクトの中心となるファイル go.mod
を作る
最後に付与するのはパッケージ名
$ go mod init hello
パッケージ 1つのファイルを複数に分割したもの。1ディレクトリ=1パッケージ
モジュール go.modファイルのあるディレクトリ以下のすべてのパッケージ(go.modは含まれない) 1レポジトリ=1モジュール
Go モジュール・パッケージをGitHubで外部に公開する場合
github.con/アカウント名/リポジトリ名/
を使う
### サンプルコードなどであれば以下のような感じでOK
$ go mod init go-example
### 公開前提の場合はモジュールのパスを指定する
$ go mod init github.com/naohito-T/go-example
Go エントリーポイント
mainパッケージは特別なパッケージ。 mainパッケージのmain関数からプログラムが開始される。
Go CLI
go fmt:コードをGo言語の標準フォーマットに変換するツール
go vet:間違えやすいコードを指摘するツール
golint:スタイルの問題を指摘するツール
godoc:コード からAPIドキュメントを作るツール
Go 歴史
昔(Go1.11以前)は $GOPATH/src
配下でしか開発できなかった。
その後Go modulesの導入により $GOPATH/src
にプロジェクトを置かなければならないという制約からは解放されたので、各プロジェクト毎に GOPATH
を指定するみたいなことがいらなくなったという経緯
そのため、こちらも現在はデフォルトから変える必要性はないです。
現在の最新歴史。これを見れば大体わかる 参考URL
Googleが開発したプログラミング言語 2009年11月に最初のバージョンをオープンソースで公開 2012年3月に正式バージョンであるGo1.0を公開 2022年5月現在の最新バージョンはGo1.18 半年毎のペースでバージョンアップ
モジュール対応モード
標準ライブラリを除くすべてのパッケージをモジュールとして管理する。 コード管理とビルドは任意のディレクトリで可能。Go1.17からは常にコレ。
モジュールとは? パッケージ: 1つのファイルを複数に分割したもの。1ディレクトリ=1パッケージ モジュール: go.modファイルのあるディレクトリ以下のすべてのパッケージ(go.modは含まれない) →1レポジトリ=1モジュール
Go 利用例
Go言語は比較的新しいプログラミング言語でありながら、世界的な動画配信サービスであるYouTubeのサーバー構築や有名Webアプリの開発などにも使用されており、人気の高い言語として世界中で愛されています。
Go 特徴
強力でシンプルな言語設計と文法 並行プログラミング 豊富な標準ライブラリ群 周辺ツールの充実 シングルバイナリ・クロスコンパイル
Go言語はC言語やJavaなどと同じく静的型付け言語でありながら、PythonやJavaScriptなどの動的型付け言語のような特徴を持つ。 Go 言語はマルチプラットフォームに対応しており、Windows/macOS/Linux/Android/iOSなどの幅広いOSに対応している(クロスプラットフォームへコンパイルできる) そのため、Webアプリケーションだけでなく、スマートフォンで動作するアプリの開発も可能。
Go言語のフレームワークでもあるGobotを使用することで、ドローンやロボットなどの高度な組込みシステムの開発も可能。 Gobotにはネットワーク上のデバイスや複数のデバイス間で相互に通信できる機能があり、外出先からデバイスを操作したりセンサーが反応したときに他のデバイスと機能を連動させたりできる。
Go言語は、近年注目の集まるクラウドやコンテナーー技術、マイクロサービスなどの最新IT技術と親和性が高く、将来性のある言語
メモリ管理の手間が少ないというメリットがありますがGC(ガベレージコレクション)のアルゴリズムがSTOP THE WORLDを採用しているため、ミッションクリティカルな場面やメモリが貧弱な環境には適さない。
クロスコンパイル対応をするには
環境変数を設定する必要がある。
# Windows(32ビット)向けにコンパイル
$ GOOS=windows GOARCH=386 go build
# Linux(64ビット)向けにコンパイル
$ GOOS=linux GOARCH=amd64 go build
Go ディレクトリ構成
Go test
golangにはgo testツールなる便利なものがある。
制約
- ファイル名の最後を_test.goとしなければいけない。
- testingをimportする必要
- テストロジックの関数は
Test**
と始める。TestA or TestAbcdefgでOK - 引数には*testing.Tを入れる。
Goでのテスト結果
Goはテストのアサーションを提供していない。テストが失敗した通知に関しては、テストが失敗したことを開発者自ら実装する必要がある。
失敗したことを示すには T.Error (T.Errorf)
や T.Fatal (T.Fatalf)
を用いることができる。
T.Fatal
を用いると T.Fatal
が実行された以降のテストは呼び出されずに終了する。
テストが失敗したことを示すには T.Error
を使い、テストの初期化など、処理が失敗するとその後のテストが無意味になる場合は T.Fatal
を用いると良い。
以下のように t.Fatalf
を用いた場合は、それ以降は呼び出されないが、defer
や T.Cleanup
といった後処理は呼び出されます。
Goにおける静的解析
Goはソースコードを実行せずに解析する静的解析の機能を提供するgoパッケージが標準ライブラリとして用意されている。 そのため静的解析を用いたコードフォーマッタやLinterなどが作りやすい言語。
Go 仕組み
コンパイル
Go 変数
Goの関数や変数は、大文字からスタートするとほかのパッケージから参照できるようになる。
※小文字だと参照できない
Go言語では一度宣言した変数を使わなかったら怒られる。そのため関数の戻り値を使用しない場合は _(アンスコ)
などを使用し使用しない宣言をする。
変数の宣言と代入を同時に行う場合には := 演算子がある。