[memo #1] メソッド(関数とは少し違うよ)

golamgマイメモ

Go言語を学ぶために「入門Goプログラミング」を読み進めながら、自分が理解を深めるためにポイントや練習結果などを残した自分用メモ。

関数とは少し違う

メソッドは、関数と似ているがちょっと違う。

ざっくり言うと 「型に振る舞いを追加して強化するもの」 なので、とりあえずメソッドを宣言する前に新しい型を宣言しておく必要がある。

…何のこっちゃ?

新しい型を宣言する

言語には元々いくつもの型が用意されているが、必ずしも自分が望む使い方が記述できるとは限らない。そこで自分で新しい型を宣言することによって、コードの意味が判りやすいくすると共にエラーを防ぎやすくすることができる。

次の例では、typeキーワードを使ってint型をベースにして新しいshowa型を宣言している。

type showa int

コード例として、

package main

import "fmt"

func main(){

        type showa int
        var myYear showa = 64

        fmt.Printf("%v\n", myYear)
}
64

メソッドの書き方

メソッドの書き方は関数とほとんど同じだが、関数では関数名の後ろに引数を記述するのに対し、メソッド名の前にレシーバーを記述するという違いがある。

注意

メソッドでは、同じパッケージ内で宣言した型ならどれでも使うことができるが、元々用意されている型(int、string、float64など)を割り当てることはできない。次の例ではレシーバーにseireki型のadを指定しているが、これを例えば(year int)などとするとエラーとなる。

汎用の型が指定できなくなるため読みやすい記述になる反面、自分で用意した型しか使えないため少し煩雑かも知れない。

// メソッドの定義
func (ad seireki) convShowa() showa {
    return showa(ad - 1925)
}

実行例

package main

import "fmt"

type showa int
type seireki int

func (ad seireki) convShowa() showa {
    return showa(ad - 1925)
}

func main(){
    var ad seireki = 1988
    var ans showa = ad.convShowa()
    
    fmt.Printf("西暦%v年は、昭和%v年です。\n", ad, ans)
}

結果

西暦1988年は、昭和63年です。

メソッドの何が嬉しいのか?

基本的にメソッドと関数は、やっていることや結果は同じであるため、その違いやメリットが分かりづらいし、ネットで調べてもなかなか解りやすい説明が見つからない。その中でも以下を読み解けば、いつか身になるかもしれない。

https://note.com/s01r0/n/nc741c89a0ad5

まとめ

メソッド vs 対象の型を引数に持つ関数について,

・確かに処理や結果は同じ

・ただし,メソッドでいい部分を関数で書くと冗長になりがち

・関数の結果がコロコロ変わるのも微妙なので,適宜使い分けよう

という結果で納得が行きました🙂

https://note.com/s01r0/n/nc741c89a0ad5

golang

Posted by doka2000gt