Go言語でオブジェクトを作ってみる: オブジェクト・メソッド・コンストラクタなど

  • 28
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

この記事の目的

  • Go言語でオブジェクトを作れるようになる
  • Go言語でメソッドを定義できるようになる
  • Go言語でコンストラクタを定義できるようになる

オブジェクトを作る

Go言語ではクラスと呼ばれるものはないらしい。

main.go
package main

import (
    "log"
)

type Money struct {
    amount   uint
    currency string
}

func main() {
    money := &Money{120, "yen"}
    log.Printf("%#v", money)
}

実行してみる

go run main.go                                                                                                                                     

結果

2013/12/10 17:28:49 &main.Money{amount:0x78, currency:"yen"}

クエリメソッドを定義してみる

状態を変更しないクエリメソッド Format を定義する:

main.go
package main

import (
    "fmt"
    "log"
)

type Money struct {
    amount   uint
    currency string
}

func (this *Money) Format() string {
    return fmt.Sprintf("%d %s", this.amount, this.currency)
}

func main() {
    money := &Money{120, "yen"}
    log.Printf("%#v", money)
    log.Print(money.Format())
}

実行しての結果

2013/12/10 17:30:41 &main.Money{amount:0x78, currency:"yen"}
2013/12/10 17:30:41 120 yen

コマンドメソッドを定義してみる

状態を変更するコマンドメソッド Add を定義する:

main.go
package main

import (
    "fmt"
    "log"
)

type Money struct {
    amount   uint
    currency string
}

func (this *Money) Format() string {
    return fmt.Sprintf("%d %s", this.amount, this.currency)
}

func (this *Money) Add(that *Money) {
    this.amount += that.amount
}

func main() {
    money := &Money{120, "yen"}
    log.Print(money.Format())
    money.Add(&Money{180, "yen"})
    log.Print(money.Format())
}

実行しての結果

2013/12/10 17:34:41 120 yen
2013/12/10 17:34:41 300 yen

コンストラクタを作る

Go言語ではJavaのコンストラクタ的なものはないみたい。代わりにファクトリー関数を定義する

main.go
package main

import (
    "fmt"
    "log"
)

type Money struct {
    amount   uint
    currency string
}

func NewMoney(amount uint) *Money {
    return &Money{amount, "yen"}
}

func (this *Money) Format() string {
    return fmt.Sprintf("%d %s", this.amount, this.currency)
}

func (this *Money) Add(that *Money) {
    this.amount += that.amount
}

func main() {
    money := NewMoney(120)
    log.Print(money.Format())
    money.Add(NewMoney(180))
    log.Print(money.Format())
}

実行結果:

2013/12/10 17:40:33 120 yen
2013/12/10 17:40:33 300 yen