ys memos

Blog

golangにおけるクラス開発の基礎


go

2021/11/20


Golang を以前学び,少しだけ LeetCode を解くことで嗜んでいたが,プロダクト開発に向けたコーディングをしてこなかった.

なので,残念ながら以前学んだ内容をほとんど忘れてしまっていた.

そんな中,Web 開発のバックエンドに Golang を使おうと思い立ち,「適当に関数だけで作っちゃお!」などと甘いことを考えていた.

しかし,そんな甘くはなく,当初思っていたよりも複雑なプログラムになりそうなので,以前 LeetCode を通じて学んだ Golang の諸々を思い出そうと思い,せっかくなのでメモ書きとして本ページに記すことにした.



いきなりタイトルを否定するようだが,Golang には class というものはなく,オブジェクト(?)は全て struct として定義する.


また,structにおいて,メンバの命名は大きな意味を持ち,lowerCamelCase は Private,UpperCamelCase は Public といった具合である. つまり,外部からアクセスしたいものは全て大文字から始まる命名にする必要がある.

このルールは変数のみならずメソッドにも適用される.これが,Golang のライブラリのメソッドが大文字から始まる所以である(嬉しいような悲しいような・・・).

type Human struct {
  Name string
  Age int
}

Golang では,クラスを生成するために,New()/NewXxx()のようなものが準備されている事が多い.

New()にするかNewXxx()にするかの選択について,package 内に一つしかクラスやNew()が存在しない場合と,package 名が表しているクラスは前者がいいと思うが,そうでない場合はNewXxx()の形式が良いと思われる.

例えば,listというパッケージがあり,Listクラスを生成する関数を作る場合にNew()を選ぶと,list.New()と呼べるのに対し,NewList()としてしまうとlist.NewList()という冗長なコードになってしまう.

さらに,ListNodeというクラスも内包している可能性があるが,そちらの方は内部で使われるため,NewListNode()で良さそうである.逆にNew()にしてしまうと,list.New()ListクラスではなくListNodeクラスが生成されるという,不自然な状態になってしまう.

// NewHumanでもよさそう
func New(name string, age int) *Human {
  return &Human{name, age}
}

これは命名規則により,外部から呼ぶことができる.


上述の通り,lowerCamelCase にするだけで Private となる.

func (this *Human) isMinnor() bool {
  return age < 20
}

上述の通り,(略

func (this *Human) Grow() {
  this.Age++
}

func (this *Human) Rename(name string) {
  this.Name = name
}

main.go
func main () {
	human := utils.New("ysuzuki", 25)
	fmt.Println(human)
	human.Grow()
	fmt.Println(human)
	human.Rename("ysato")
	fmt.Println(human.Age, "歳の", human.Name, "です!")
}
output
&{ysuzuki 25}
&{ysuzuki 26}
26 歳の ysato です!

Golang を思い出せたので,良い機会になった.


自分のコード参考にしちゃった

関連タグを探す