Goはオブジェクト指向っぽい事が出来る

created byTakuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.

型とメソッドで、オブジェクト指向のようなプログラミングできる

Go言語 / golangは一般的なオブジェクト指向をサポートしていません。クラス・継承はありませんが型とメソッドで、オブジェクト指向のようなプログラミングは可能です。

例えばGo言語 / golangの型には構造体や文字列・数値などありますが、それらに対してメソッドが定義可能です。

例:

package main

import "fmt"

type integer int

func (n integer) PrintNumber() {
    fmt.Println("int: ", n)
}

func main() {
    var number integer = 32
    number.PrintNumber()
}
go

これを実行すると、int: 32と表示される。

このプログラムについて解説していきたいと思います。type integer intこの行はGo言語 / golangの数値型であるintをintegerとして新しい名前の型を定義しています。Go言語 / golangの仕様により直接intにメソッドを定義することは出来ないため行っています。

func (n integer) PrintNumber()はinteger型のレシーバーを付きの関数です。レシーバーを宣言すると、指定した型のメソッドが定義できます。

このように型に対してメソッドを定義できるので、オブジェクト指向のようなプログラミングが可能です。

Goのクラスっぽい構造体の定義

もっと分かりやすくする為に、RubyのクラスとGo言語 / golangのクラスっぽい構造体の定義と比較します。

ruby

class Hoge
    def initialize(hoge_message)
        @message = hoge_message;
    end

    def print
        puts @message
    end
end

hoge = Hoge.new("hoge message");
hoge.print();
ruby

Go言語 / golang

package main

import "fmt"

type Hoge struct {
    message string
}

func NewHoge(hogeMessage string) *Hoge {
    return &Hoge{message: hogeMessage}
}

func (hoge *Hoge) Print() {
    fmt.Println(hoge.message)
}

func main() {
    var hoge *Hoge = NewHoge("hoge message")
    hoge.Print()
}
go

コンストラクター

rubyは、def initialize(hoge_message)Go言語はfunc NewHoge(hogeMessage string) *Hogeです。 両言語とも、処理の内部でmessage変数に引数の値を代入しています。

Go言語 / golangはクラスが無いので、構造体を指定した引数を代入してポインターを返しています。NewHogeという名前は、構造体を初期化して返す関数名を”New”+“構造体型名”と推奨している為です。

Printメソッド

rubyはdef print、Go言語 / golangはfunc (hoge *Hoge) Print()です。Hoge構造体のポインターのレシーバー付きのメソッドです。hoge.Print()が実行されると、このメソッドが実行されます。

どうでしょうか、Go言語 / golangでもオブジェクト指向っぽいプログラミングは出来ます。ではGo言語 / golangの多様性や継承はどうなのかは次回解説します。

prevnext