あいさつ
こんにちは, T.Miura(24)です.25(専門)卒です.
最近東京に引っ越しました.
少しだけ忙しくなり,コードを書いたり本を読んだ理が少しおろそかになっていました.
気合いでなんとか持ち直した今日この頃です.
明日から新社会人になる皆様.
一緒に頑張っていきましょう.
はじめに
以前作成したRESTfullAPIでメソッドレシーバーの使い方がわからず断念しておりました.
関数型のようにしていたコードをリファクタリングし,メソッドレシーバーについて少し理解したので記事にします.
この記事ではメソッドレシーバーについて簡単にまとめています.
簡単なコードも記載しています.
開発環境
Go 1.24.0
メソッドレシーバーとは
OOPでいうメソッドに相当する機能です.そのままですね.
構造体 || struct に基づく機能や振る舞いを管理することができます.
fmt.Println("Hello world!")
の .Println("Hello world!!") の部分です.
. の後に関数名を記述するのが特徴です.
メソッドレシーバーは可読性と保守性向上に一役買ってくれる子達です.
しかもGoはシンプルに書けることを目的としているので書き方もシンプルです.
メソッドレシーバーの種類について
その前に
具体的な説明の前にまずはstructを定義します
type Todos struct {
Id int
Title string
IsDone bool
}
func (t Todos) Function() string
は
(変数名 構造体) メソッド名() 型
です
値レシーバー
値レシーバーは元の値を変更しません.
例では,Todoの表示に使用します.
func (t Todos) DisplayTodo() string {
return fmt.Sprintf("ID:%v \n Title:%v\n IsDone:%v\n",t.Id, t.Title, t.IsDone)
}
とすることで簡単に全てのカラムを表示することができます.
ポインタレシーバー
ポインタレシーバーは元の値を変更できます.
例ではTodoが完了未完了を管理するbool値を反転に使用します
func (t *Todos) EndTodo(){
t.IsDone = !t.IsDone
}
コードの全体像
package main
import (
"fmt"
)
type Todos struct {
Id int
Title string
IsDone bool
}
// 値レシーバー
func (t Todos) DisplayTodo() string {
return fmt.Sprintf("ID:%v\nTitle:%v\nIsDone:%v\n", t.Id, t.Title, t.IsDone)
}
// ポインタレシーバー
func (t *Todos) EndTodo() {
t.IsDone = !t.IsDone
}
func main() {
todo := Todos{
Id: 1,
Title: "Goのコードを書く",
IsDone: false,
}
fmt.Println(todo.DisplayTodo())
//Todo完了 IsDoneの反転
todo.EndTodo()
fmt.Println(todo.DisplayTodo())
}
Id:1
Title:Goのコードを書く
IsDone:false
Id:1
Title:Goのコードを書く
IsDone:true
しっかりとTodoが表示され,IsDoneが更新されましたね!
今回は簡単なコードでポインタレシーバーを使用して更新するメリットはあまり感じられません.
しかし,ロジックが大きくなれば可読性も上がりますし,カプセル化の役割も果たします.
まとめ
メソッドレシーバーについてかなり浅い部分の記事でしたが,ここまで読んでいただきありがとうございます.