🎱
【GoとPython】異なる言語、共通する哲学
この記事はAndrew Gerrand氏のGo and the Zen of Python[1]を訳したものです。
"Beautiful is better than ugly."
Goは、C言語を彷彿とさせる軽量で規則的な構文を持っている
しかし、美しいか醜いかは、個人に依存する
"Simple is better than complex."
メソッドはただの関数であり、特別な場所は無い
thisやselfなどのキーワードはなく、レシーバは他の関数引数と同じようなものである
type Vector struct {
X, Y float64
}
func (v Vector) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
"Simple is better than complex."
メソッドはクラスがなくても任意の名前付き型で宣言できる
type Scalar float64
func (s Scalar) Abs() float64 {
if s < 0 {
return float64(-s)
}
return float64(s)
}
"Simple is better than complex."
インターフェースは単なるメソッドであり、データは含まれない
インターフェースは暗黙的で、実装宣言は不要
type Abser interface {
Abs() float64
}
"Simple is better than complex."
type Database struct {
client *rpc.Client
}
func NewDatabase(addr string) (*Database, error) {
client, err := rpc.Dial("tcp", addr)
if err != nil {
return nil, err
}
return &Database{client}, nil
}
コンストラクタやデストラクタは存在しない
コンストラクタはただの関数である
"Simple is better than complex."
識別子のケースが可視性を設定する
大文字で始まる名前はパッケージの外部からも見える
package foo
type Foo struct { // exported type
bar int // unexported field
}
func (f Foo) Bar() {} // exported method
func (f Foo) quux() {} // unexported method
"Simple is better than complex."
- メモリ管理をガベージコレクションだけで行う
- 通常のスコープ付け規則と名前のシャドウイング規則に従う
- サブタイプの継承(サブクラス)が無い
- デコレータが無い
- 関数において引数に名前を付けたり、オプショナルな引数を指定する機能は無い
- イテレータの概念が無い
- ジェネレータの概念が無い
- 例外の概念が無い
"Explicit is better than implicit."
- エラー処理が明示的であり、例外が存在しない
- 依存関係が明示的である
- 数値の型変換が暗黙的に行われることは無い
- 構造体(structs)はメモリのレイアウトを明示的に定義する
"Flat is better than nested."
早期に脱出することは慣用的なコーディングスタイルである
func badStyle(a int) error {
b, err := one(a)
if err == nil {
c, err := two(b)
if err == nil {
err = three(c)
}
}
return err
}
func goodStyle(a int) error {
b, err := one(a)
if err != nil {
return err
}
c, err := two(b)
if err != nil {
return err
}
return three(c)
}
"Flat is better than nested."
- クラスが存在しないため、メソッドはクラスにネストされない
- パッケージの名前空間がフラット
- 同じパッケージに属する複数のファイルは、同じ名前空間を共有する
"Sparse is better than dense."
Go言語の構文は、複雑な一行のコードを奨励していない
- リスト内包表記が無い
- 三項演算子が無い
Go言語のコードを読む際、制御フローが明示的であることが期待されている
"Practicality beats purity."
Go言語は、一般的なデータ構造を組み込んでいる
- maps (dicts)
- slices (lists)
- channels (Pythonのqueuesのような並行性プリミティブ)
"Readability counts."
Go言語は、大規模なプログラム開発チーム向けに設計された
可読性は極めて重要である
-
gofmt
ツールは、Go言語で採用された"one true style"(一貫したスタイル)を強制する - 型推論はタイピングの手間を省く一方で、可読性を損なわないように設計されている
- 型は可読性を向上させる場面で依然として必要である 例えば、関数の宣言などで型を指定することで、コードの理解が容易になる
"Now is better than never."
Goを今日学ぼう、それは簡単だ
- 一日で生産的に
- 一週間で効率的に
- 一年でエキスパートに
参考文献、記事、チュートリアルなど:
ウェブベースのインタラクティブなGoツアー:
Discussion