途中まで esa にメモりながら進めていたのでそのメモを投下しておく。
慣れてくると、実際にコード書いてみたり読んでなるほどという感じで進めていけたのでメモがなくなった。何より本自体がリファファレンスぽいのでメモが不要になったってのもある。
Golang をインストールする
https://github.com/syndbg/goenv を使ってみた。
git clone https://github.com/syndbg/goenv.git ~/.goenv
.zshrc
などにREADMEの内容を記述してから、
goenv install 1.10.3
:tada:
以下メモ。
いまは次の課題として、
を読みながらWEBアプリ作ってみるというのをやっている。なかなか面白い。『スターティングGo言語』とDocumentation - The Go Programming Languageを読みながら進めることが多い。
1. 開発環境
- わからん :thinking: goenv入れるときにGOPATH設定しなかったぞ
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管理しておこうと思って、実行ファイルをどう除こうかな?と迷って調べた。
.gitignoreに拡張子なしのファイルを登録する - 備忘録置いとく
なるほど便利。
*
!*/
!*.*
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 := '越'
var int32Type int32 = '越'
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 {
fmt.Printf("error: %v\n", error)
}
fmt.Printf("result: %v\n", result)
}
定数
const (
A = iota
B = iota
C = iota
D = "D"
E = iota
)
const (
X = iota
Y
Z
)
スコープ
- パッケージ
- ファイル
- 関数
- ブロック
- 制御構文(if, forなど)
for
for {
break
}
for i := 0; i < 10; i++ {
fmt.Printf("i: %v ", i)
fmt.Println()
}
for i, v := range [3]string{"上々家", "誠家", "雷家"} {
fmt.Printf("ramens[%v] = %v\n", i, v)
}
if
if _, err := doSomething(); err != nil {
}
フォーマット整形してくれる便利ツール
脇道それるけど、gitのhookってどう管理するのがベストかなーと調べて見た。
https://github.com/git-hooks/git-hooks
昔こういうの見たことある気もするが使ってなかったな。
というところで、メモは終わっている。理由は、冒頭で説明した通り。
フィードバック(追記)