読者です 読者をやめる 読者になる 読者になる

Go言語入門 / golang 入門 Go言語 / golangはオブジェクト指向っぽい事が出来る

f:id:nasust:20161122141513p:plain The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) CC3.0

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()
}

これを実行すると、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();

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()
}

コンストラクタ

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

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

Printメソッド

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

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


Go言語 / golang 入門 目次に戻る

広告を非表示にする