- 作者: 松尾愛賀
- 出版社/メーカー: 翔泳社
- 発売日: 2016/04/15
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
途中まで esa にメモりながら進めていたのでそのメモを投下しておく。 慣れてくると、実際にコード書いてみたり読んでなるほどという感じで進めていけたのでメモがなくなった。何より本自体がリファファレンスぽいのでメモが不要になったってのもある。
Golang をインストールする
https://github.com/syndbg/goenv を使ってみた。
git clone https://github.com/syndbg/goenv.git ~/.goenv
.zshrc
などにREADMEの内容を記述してから、
goenv install 1.10.3
:tada:
以下メモ。
いまは次の課題として、
Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ
- 作者: Sau Sheong Chang,武舎広幸,阿部和也,上西昌弘
- 出版社/メーカー: インプレス
- 発売日: 2017/03/17
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
を読みながらWEBアプリ作ってみるというのをやっている。なかなか面白い。『スターティングGo言語』とDocumentation - The Go Programming Languageを読みながら進めることが多い。
1. 開発環境
- わからん :thinking: goenv入れるときにGOPATH設定しなかったぞ
- Go言語をMacにインストールしてみる(goenv + direnv + glide) - Qiita
- プロジェクトごとにdirenvで設定するものぽい?
- とりあえず p. 17の通り
mkdir ~/go
して、~/.zshrc
にexport GOPATH="$HOME/go"
を足した。
- Go言語をMacにインストールしてみる(goenv + direnv + glide) - Qiita
2. プログラムの構成と実行
go run hoge.go
でビルドプロセスを隠蔽してコンパイルしたコードを実行できる- 参照のないパッケージをimportしたままだとコンパイルエラーとなる
_ "fmt"
のように_
を付けると、参照されていないパッケージを強制的にプログラム内に組み込むことができる
- Goプログラムのエントリーポイントは
main
パッケージの中に定義された関数main
であると定められている go build -o hoge hoge.go
でコンパイルして実行ファイルを作る
readelf
コマンドがmacにないので、
brew install binutils
してgreadelf
を入れてみる。
んがだめ
ELF ファイルではありません - 始点にあるマジック番号が異なります
https://teratail.com/questions/40401 Mac OS X上の実行可能バイナリはELF形式ではなく、Mach-O形式と呼ばれるフォーマットです。
そうなんすねー。linuxで試すかの。go動かせる環境をdockerで用意しよう。
docker pull golang
なるほどvim
も入ってねえか。そりゃそう。
golangでdockerをはじめる ~ goのwebサーバーをdockerでたててみた ~ - Qiita
そうか、適当におれ用みたいなのをdocker hubにおいておきゃいいのね〜。
以下で遊べるようにしておいた。
docker container start golang_practice -ai
p.32 の 実行時に
go run main.go package main: main.go:3:8: expected 'STRING', found '{' main.go:4:3: expected ';', found 'STRING' "fmt"
でハマった。import
は()
なのね〜〜。エラーメッセージ的にもしかして()
ってのは複数行でかく時用のもので、import String
出かけるのかもと思って試したら、いけた。なるほどね!
git管理しておこうと思って、実行ファイルをどう除こうかな?と迷って調べた。
なるほど便利。
* !*/ !*.*
3. 言語の基本
コメント
// コメント /* コメント */
文
- Goのコンパイラは
{
や,
で終わる場合を除いて、単純に分の終端であると判断し、;
を自動で付与する。- じゃあなぜ
import
の中身はコンパイルエラーにならんのだ :thinking: - どうやら
hoge ()
で()
内に対してhoge
をするのと同じことぽい(p. 57のvar
の説明より)
- じゃあなぜ
a := [3]string{ "A", "B", // ケツカンマが必須 }
定義済み識別子
https://golang.org/ref/spec#Predeclared_identifiers Types: bool byte complex64 complex128 error float32 float64 int int8 int16 int32 int64 rune string uint uint8 uint16 uint32 uint64 uintptr
Constants: true false iota
Zero value: nil
Functions: append cap close complex copy delete imag len make new panic print println real recover
変数
- 値型, 参照型, ポイント型がある
var a1 int // 明示的宣言 var ( // 複数同時宣言 a2, a3 int = 2, 3 a4 string ) a4 := 4 // 定義と代入をまとめて暗黙的に型を定義
基本型
- rune型
- ''で囲う
- Unicodeコードポイントを表す特殊な整数型
- int32の別名なので中身は整数と全く同じ
- 文字列型
- ""で囲う
- RAW文字列リテラル
- ``で囲う
- \nなどもそのまま表示される、改行入れたければ実際に改行する
runeType := '越' // シングルクォーテーションはrune型となる var int32Type int32 = '越' // 36234 == 36234 // true fmt.Printf("%v == %v // %v\n", runeType, int32Type, runeType == int32Type) s := "越川" ss := `文字列 たくさんかくよ〜 へいへい` fmt.Printf("%v said: %v\n", s, ss)
配列型
- 固定長
- 可変長は、スライスという型がある
b1 := [3]int{1, 2, 3} b2 := [...]int{1, 2, 3} // 要素数の省略
interface()
- Goにおけるあらゆる型と互換性のある特殊な型
- 値が入っていないときには、
nil
になる - すべての型の値を汎用的に表す手段
- 演算の対象にはできない
- 値が入っていないときには、
関数
error 処理のイディオム
package main import ( "errors" "fmt" ) func doSomething() (bool, error) { error := errors.New("Something error") return true, error } func main() { result, error := doSomething() if error != nil { // error 処理 fmt.Printf("error: %v\n", error) } fmt.Printf("result: %v\n", result) }
定数
- 整数値の定数には原則として最大値がない
- 整数値の定数と基本型の整数値は根本的に別のもの
const ( A = iota // const中で定数が定義されるたびに増えるので 0 B = iota // const中で定数が定義されるたびに増えるので 1 C = iota // const中で定数が定義されるたびに増えるので 2 D = "D" // const中で定数が定義されるたびに増えるが使わない E = iota // const中で定数が定義されるたびに増えるので 4 ) const ( X = iota Y Z )
スコープ
- パッケージ
- ファイル
- import 宣言のみ独立している
- 関数
- ブロック
- 制御構文(if, forなど)
for
for { break // 無限ループ } for i := 0; i < 10; i++ { fmt.Printf("i: %v ", i) fmt.Println() } // Range Clause による for for i, v := range [3]string{"上々家", "誠家", "雷家"} { fmt.Printf("ramens[%v] = %v\n", i, v) }
if
if _, err := doSomething(); err != nil { // err は ifの中だけで参照されるスコープ }
フォーマット整形してくれる便利ツール
- go fmt
- gofmt - The Go Programming Language
- go - The Go Programming Language
go fmt
はgofmt -l -w
と同じ
- https://golang.org/misc/git/pre-commit を使って、コミット前に
go fmt -w
しようぜってのが強制できる
pre-commit で gofmt -w しようぜってメッセージ出してくれるやつ 👀 https://t.co/6geIa193al
— KOSHIKAWA (@ppworks) 2018年8月8日
脇道それるけど、gitのhookってどう管理するのがベストかなーと調べて見た。
https://github.com/git-hooks/git-hooks
昔こういうの見たことある気もするが使ってなかったな。
というところで、メモは終わっている。理由は、冒頭で説明した通り。
- 作者: 松尾愛賀
- 出版社/メーカー: 翔泳社
- 発売日: 2016/04/15
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
フィードバック(追記)
ブログ記事参考になりました。ありがとうございます。開発環境の部分で書かれているGolangでのプロジェクト管理ですが、私はdirenvを使わず https://t.co/jAcMZ6BKAL に書かれている指針に従っています。
— 5,000キロ走る男 みよひで (@miyohide) 2018年8月25日