サーバーサイドプログラムを作成しようと思い。ベンチマークでよい値が出ているGo言語を勉強したのでそのメモです。ご指摘等があればよろしくお願いいたします。
Objective-C等はいじったことがあるのと、昔C++をいじったことがあったので取っ付きやすいかと思ったのですが結構癖があったのでメモします。
Go言語はClassの概念がないので、property等を公開しないようにするにはinterfaceを使って隠す必要があります。
sample.go
ackage main
import (
"fmt"
)
// Human interface
type Human interface {
setName(string)
getName() string
setAge(int)
getAge() int
}
まず、interfaceを使ってPublicのMethodを定義します。小文字で始まる関数名がよいのかはよくわかっていません・・・。Objective-C風にしてしまいました・・・。
次にprivate部分を実装です。
sample.go
// human private
type human struct {
name string
age int
}
次にinterface部分で定義したmethodを記述していきます。ここで私がはまったのはHumanで実装するのではなくinterfaceを採用する構造体に実装することです。つまりここでいうhumanに所属させて実装することです。当たり前ですよね〜。だってhumanのname,ageにアクセスできないですものね。
sample.go
// human methods
// name setter
func (h *human) setName(yourname string) {
h.name = yourname
}
// name getter
func (h *human) getName() (yourname string) {
return h.name
}
// age setter
func (h *human) setAge(yourage int) {
h.age = yourage
}
// age getter
func (h *human) getAge() (yourage int) {
return h.age
}
こんな感じです。
次に、humanを作って返す関数を実装します。サンプルとして単純に作成するものと、初期値を与えて作成するものを作りました。
sample.go
// Human initializer
func InitHuman() Human {
return new(human)
}
func setInitHuman(name string, age int) Human {
return &human{name: name, age: age}
}
実際に呼び出して使ってみましょう。
sample.go
// Main
func main() {
yuta := InitHuman()
yuta.setName("hogehoge")
yuta.setAge(5)
fmt.Println("Name is", yuta.getName(), "Age is", yuta.getAge())
kazu := setInitHuman("ageage", 15)
fmt.Println("Name is", kazu.getName(), "Age is", kazu.getAge())
kazu.setName("tegetege")
kazu.setAge(25)
fmt.Println("Name is", kazu.getName(), "Age is", kazu.getAge())
}
以上です。
もっとこう書いたらCoolというのがあったら教えてください。