2020/03/03

[golang]class関数っぽいやつはメソッド

気を抜くと・・・実装をまったくやっていない・・・。
意味が無くても良いので、何か手を動かさねば。

 

というわけで、今回はgolangのclass関数っぽいやつをやってみる。


classっぽい関数というのは、あれだ。

  • 実装としてはstruct
  • 関数名の前に括弧してstructの変数を書いておくと、その変数があたかもグローバル変数であるかのように使用できる

 

名前が分からんのだ・・・。
正式名が分かれば検索できるのだが、どうにも覚える気力が湧かない。

https://golang.org/ref/spec#Function_declarations

あれ・・・funcの直後に関数名が来ているぞ?

https://golang.org/ref/spec#Method_declarations

こっちだ。
そうか、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: }
  

はい、ダメでした。
オーバーロードはないのね。

https://golang.org/doc/effective_go.html#composite_literals

うーん、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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。