気を抜くと・・・実装をまったくやっていない・・・。
意味が無くても良いので、何か手を動かさねば。
というわけで、今回はgolangのclass関数っぽいやつをやってみる。
classっぽい関数というのは、あれだ。
- 実装としてはstruct
- 関数名の前に括弧してstructの変数を書いておくと、その変数があたかもグローバル変数であるかのように使用できる
名前が分からんのだ・・・。
正式名が分かれば検索できるのだが、どうにも覚える気力が湧かない。
あれ・・・funcの直後に関数名が来ているぞ?
こっちだ。
そうか、functionとmethodは別物だったのか。
class変数っぽいやつは、Receiverという名前ね。うん、どこかで聞いた覚えはある。
というわけで、今回はメソッドをやってみるのだ。
src/ex6/cmd/main.go
01: package main 02: 03: import "ex6/gogo6" 04: 05: func main() { 06: var da gogo6.Data6 07: 08: da.PrintGogo() 09: }
src/ex6/gogo6/print_gogo.go
01: package gogo6 02: 03: import "fmt" 04: 05: type Data6 struct { 06: name string 07: age int 08: } 09: 10: func (data *Data6) PrintGogo() { 11: fmt.Printf("name: %s\n", data.name) 12: fmt.Printf("age: %d\n", data.age) 13: }
src/ex6$ go run ex6/cmd
name:
age: 0
初期化していないので、デフォルト値が出力されている。
C言語の人としては未初期化の変数を使うのは心が痛むのだが、まあ動くからよかろう。
未初期化が嫌なら初期値を設定すれば良いのだが、Data6のメンバは小文字で始まっているので外部からはアクセスできない(undefinedになる)。
この手の構造体は、Newするメソッドも用意するのが一般的だったと思う。
なので、print_gogo.goにこういうメソッドを追加しようとした。
01: func (data *Data6) NewData6() { 02: data.name = "" 03: data.age = 0 04: } 05: 06: func (data *Data6) NewData6(name string, age int) { 07: data.name = name 08: data.age = age 09: }
はい、ダメでした。
オーバーロードはないのね。
うーん、Newは値の初期化というよりは、普通にメモリを確保する方がよさそうだ。
初期化だけだったらInitがいいのかな?
メモリ確保も、golangだとnewとmakeがあるようだ。
眺めた感じでは、newは1つ、makeはmapとかsliceとかかな。
src/ex6/cmd/main.go
01: package main 02: 03: import "ex6/gogo6" 04: 05: func main() { 06: da := gogo6.NewData6("yoshio", 95) 07: 08: da.PrintGogo() 09: }
src/ex6/gogo6/print_gogo.go
01: package gogo6 02: 03: import "fmt" 04: 05: type Data6 struct { 06: name string 07: age int 08: } 09: 10: func NewData6(name string, age int) *Data6 { 11: data := new(Data6) 12: data.name = name 13: data.age = age 14: return data 15: } 16: 17: func (data *Data6) PrintGogo() { 18: fmt.Printf("name: %s\n", data.name) 19: fmt.Printf("age: %d\n", data.age) 20: }
src/ex6$ go run ex6/cmd
name: yoshio
age: 95
newは解放もあるかもしれんが、今日はここまで。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。