🦫
GOlang入門
随時更新
環境構築
- dockerfileを作成
- docker-compose.ymlを作成
- vscodeのソース管理タブで"GitHubに公開"を選択し、リポジトリ名を決めpush
- リモートで
git init
、ローカルでgit init
、git add .
、git commit -m "first commit"
、git remote add origin https://github.com~~~~
、git push
まで自動で行われる
- masterからmainに変更する(githubのリモート&ローカルブランチ)branches
-
docker-compose up -d
で起動 -
docker-compose down
で削除
コードを実行
- マウントディレクトリにmain.goを作成
-
docker-compose up -d
で起動 -
docker-compose exec app go run main.go
-docker-compose run app go run main.go
ならdockercomposeが起動していなくても実行できる
基礎初級~progate~
基礎初級~A Tour of Go~
- 複数戻り値について
-
戻り値に名前をつける
変数について- 関数外で定義する際はキーワードではじまる宣言( var, func, など)が必要、:=ではだめ
- 変数に初期値を与えないとゼロ値( zero value )が与えられる 👉nullではない
- 数値型は0
- bool型はfalse
- string型は""(空文字)
- 定数について
- importをまとめる
基礎中級~progate~
変数はコンピュータのメモリに保存され、その場所をアドレスと呼ぶ
👉アドレスは16進数で表され、他の変数に代入することもできる
👉GOではアドレスをポインタと呼び扱っている
-
ポインタについて
ポインタが代入された変数をポインタ型変数と呼ぶ
ポインタ型は「*変数の型」で定義できる - 変数に"&"をつける👉"ポインタ"を出力できる
- ポインタ型変数に"*"をつける👉"ポインタが示す変数の値"を出力できる
- ポインタ型変数について
- 関数をまたぐポインタについて
- 引数のポインタについて1
- 引数のポインタについて2
基礎中級~A Tour of Go~
- 構造体について
- レシーバについて
- メソッドについて
- レシーバを引数にとる関数について
- 型の別名作成について
- ポインタレシーバをメソッドに適用する方法について・改
-
インターフェースについて
nilはポインター、インターフェイス、マップ、スライス、チャネル、および関数タイプのゼロ値である -
nilについて
アサーションは2つの値(基になる値とアサーションが成功したかどうかを報告するブール値)を返す - 型アサーションについて
- 型switchについて
- Stringersについて
Moduleについて
(modファイル作る前からfmtとか使えたけどなぜなのか)
Goのパッケージ管理システム
go.modファイルを作成する
$ go mod init 命名
パッケージのインストール方法
go.sumファイルが作られ、これにはパッケージのバージョンとそのhash値が入っている
👉 npmでいうpackage.lock.jsonみたいなもの
$ go get -u インストールしたいパッケージ
👉 -uをつけることで、パッケージとその依存パッケージをネットワークから更新できる
未使用のパッケージを削除する
$ go mod tidy -v
👉 -vをつけることで、削除されたパッケージ情報を出力できる
先にmain.goにimportされていないパッケージを記述しておいて、コマンドでインストールする
$ go build
👉 本来はコンパイルする為に使われるコマンド
👉 コンパイル後はバイナリファイルが生成され、ファイル名を指定しただけでGOが走る(runする)
👉 バイナリファイルはgo.modにあるmodule名になる
環境変数を表示
$ go env
スターティングGo言語
制御構文までの基礎
-
パッケージと構成について1
- Goは1つのディレクトリには1つのパッケージのみ定義可能であり、複数のパッケージ定義を同一のディレクトリ内に置くことはできない
-
パッケージと構成について2
- mainパッケージの分割
-
$ go run main.go app.go
か$ go run *.go
で実行
- パッケージと構成について3
-
パッケージと構成について3`
- Goにはパッケージの機能をテストする機能がある
- testingにテストを行うためのさまざまな関数がある
- 今回使ってるのはErrorf()
-
$ go test module名/ディレクトリ名
でテストを実行
- 変数の暗黙的宣言のスコープについて
- 複数行にまたがる文字列について
-
配列について1
- [要素数]要素の型 で一つの型として認識している
- [5]int !== [3]int
- [5]int === [5]int
- [要素数]要素の型 で一つの型として認識している
-
配列について2
- Goの配列型は拡張、縮小は不可能
- 要素数は一定 👉 可変式にしたいならスライスというデータ構造を使う
-
関数の戻り値について
- 割り振り代入 👉 複数の戻り値を一気に変数に代入すること
- 戻り値の破棄 👉 複数の戻り値のうち、いらない値を破棄して戻り値を受け取ること
- 無名関数について
- 関数の別名について
-
クロージャについて
- 無名関数と無名関数の処理に関係する無名関数外の環境のことをクロージャという
- 定数定義について
- Goのスコープについて、大きい順で
- パッケージ
- 複数のファイルで構成されている
- 定数、変数、関数などが他のパッケージから参照可能であるかは識別子の一文字目が大文字であるかどうかで決まる
-
fmt.Println()
はfmtパッケージのPrintln関数を呼び出しているが、これはPrintln関数が大文字から始まっているから参照ができている
- ファイル
- 同じパッケージのファイルでも、各々のimport定義が独立して働く
- 片方のファイルでは「f "fmt"」という定義、もう片方では「. "fmt"」という定義が成立する
- 関数
- ブロック
- { ... } で囲われたソースコード群
- 制御構文
- パッケージ
- パッケージ名上書きについて
- if,forについて
- 配列のfor文表示について
-
switchについて
- 簡易文は変数の局所性を高める働きがあるため、積極的に使っていく
-
goto文について
- ほとんど使うことがない
- ラベル付き文について
-
deferについて
- 定義されるものは関数呼び出しの形式に限られる
- 例
defer fmt.Println("A")//関数呼び出しの形式 👉 最後に()がつく
defer func(){
fmt.Println("A")
fmt.Println("B")
}() //関数呼び出しの形式 👉 最後に()がつく
-
panicとrecoverについて
- 一種の例外処理を実現するものだが、goを強制的に停止させる機能を持つため多用するものではない
- この仕組みを利用しているプロダクトはわずか
- panic文が定義されているところまでは処理が走る
-
go文について
- 並行処理 👉 goはこれを簡単に実現する
- 物理的に、複数の仕事を同時に行っていること
- cpuのコアが1つだと実現できない
- 並列処理
- 複数の仕事間を瞬時に切り替えることによって、同時にやっているように見えること
- 並行処理 👉 goはこれを簡単に実現する
-
initについて
- 引数、戻り値を設定するとエラーが出る
- 一番初めに評価されるので、初期化に使われる
参照型
- make関数を使用して参照型は生成される
- 参照型にはスライス、マップ、チャネルの3種類が用意されている
-
スライスの基礎と配列との比較について
- 可変式の配列
-
スライスの特徴について
- 要素追加には
append
を使う - 引数のスライス
...
をつけることでスライスを可変できる引数として機能する
- 要素追加には
Discussion