2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2023-12-25

この記事はAndrew Gerrand氏のGo and the Zen of Python1を訳したものです。

"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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?