🎱

【GoとPython】異なる言語、共通する哲学

2023/12/27に公開

この記事は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を今日学ぼう、それは簡単だ

  • 一日で生産的に
  • 一週間で効率的に
  • 一年でエキスパートに

参考文献、記事、チュートリアルなど:
https://go.dev/

ウェブベースのインタラクティブなGoツアー:
https://go.dev/tour

脚注
  1. https://go.dev/talks/2012/zen.slide#1 ↩︎

Discussion