2021/11/20
はじめに
Golang を以前学び,少しだけ LeetCode を解くことで嗜んでいたが,プロダクト開発に向けたコーディングをしてこなかった.
なので,残念ながら以前学んだ内容をほとんど忘れてしまっていた.
そんな中,Web 開発のバックエンドに Golang を使おうと思い立ち,「適当に関数だけで作っちゃお!」などと甘いことを考えていた.
しかし,そんな甘くはなく,当初思っていたよりも複雑なプログラムになりそうなので,以前 LeetCode を通じて学んだ Golang の諸々を思い出そうと思い,せっかくなのでメモ書きとして本ページに記すことにした.
本題
ベース
いきなりタイトルを否定するようだが,Golang には class
というものはなく,オブジェクト(?)は全て struct
として定義する.
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}
}
これは命名規則により,外部から呼ぶことができる.
Private
上述の通り,lowerCamelCase にするだけで Private となる.
func (this *Human) isMinnor() bool {
return age < 20
}
Public
上述の通り,(略
func (this *Human) Grow() {
this.Age++
}
func (this *Human) Rename(name string) {
this.Name = name
}
ためしに使ってみる
func main () {
human := utils.New("ysuzuki", 25)
fmt.Println(human)
human.Grow()
fmt.Println(human)
human.Rename("ysato")
fmt.Println(human.Age, "歳の", human.Name, "です!")
}
&{ysuzuki 25}
&{ysuzuki 26}
26 歳の ysato です!
おわりに
Golang を思い出せたので,良い機会になった.
参考
自分のコード参考にしちゃった