funcで関数を作る
型を全部書く
Go
func feeOf(price int, rate float64) int {
return int(float64(price) * rate)
}読む順番は「func → 名前 → 引数 → 戻り値の型 → 中身」です。
引数も戻り値も、型を省略できません。何を受け取って何を返すのか、宣言の1行を見れば分かります。中身を読まずに使い方が分かる、というのが Go の関数の基本姿勢です。
同じ型が続くときはまとめられる
Go
func addPrice(a int, b int) int
func addPrice(a, b int) int // 同じ意味最後の1つに型を書けば、手前の引数も同じ型になります。3つ4つと並ぶときに効きます。
戻り値が無い関数
Go
func logStart(name string) {
fmt.Println(name, "を開始します")
}戻り値の型を書かなければ、何も返しません。
大文字で始まるかどうかで公開が決まる
Go には public や private という言葉がありません。代わりに名前の1文字目で決まります。
プレーンテキスト
FeeOf 大文字始まり 他のパッケージから使える
feeOf 小文字始まり 同じパッケージの中だけこれも Go らしい割り切りです。修飾子を書く場所を作らず、名前だけで表します。慣れると、名前を見ただけで公開範囲が分かるので読むのが速くなります。
関数に切り出す判断
第2章のつくる回で、状態を日本語にする部分を別の関数にしました。あれと同じ判断です。
プレーンテキスト
同じ処理が2回以上出てきた
中身に名前を付けたほうが読みやすい
そこだけ単体で確かめたいこのどれかに当てはまったら切り出します。逆に、1回しか使わず名前も付けにくいものを無理に関数にすると、行ったり来たりが増えて読みにくくなります。
関数の中に関数を書ける
Go
func main() {
double := func(n int) int {
return n * 2
}
fmt.Println(double(3)) // 6
}名前の無い関数を変数に入れる形です。第7章のゴルーチンで、この書き方が頻繁に出てきます。いまは「そういう書き方もある」と知っておけば十分です。
要件
feeOfが価格を受け取って手数料を返す- 手数料は価格の10パーセントで、小数は切り捨てる
payoutOfはfeeOfを呼び、価格から手数料を引いた額を返す
入出力例
payoutOf(1200) → 1080
payoutOf(999) → 900
payoutOf(24800) → 22320
payoutOf(0) → 0ヒント
編集 ゆめさく編集部