あべぶろ

気になった技術の備忘録を残します。

[Golang] メソッドバリューについて触れてみる

概要

  • テストコードに関して、メルカリさんの記事を読んでいると、 tech.mercari.com
  • メソッドバリューという気になるワードを発見。
  • この概念を知らなかったので、今回調べてみた。

メソッドバリューとは

The method value x.M is a function value that is callable with the same arguments as a method call of x.M.

  • (意訳)メソッドバリューは、メソッドと同様に引数を渡して呼び出すことが出来る関数が格納されている値のことである。*公式サイトより
  • ソース見た方が早いので以下のように試してみる。
package main

import "fmt"

type T struct {
    a int
}
func (tv  T) Mv(a int) int         { return 0 }  // value receiver
func (tp *T) Mp(f float32) float32 { return 1 }  // pointer receiver

func main() {
    // 通常に初期化、メソッド呼び出し
    var t T
    fmt.Println(t.Mv(0))    // 0
    fmt.Println((&t).Mp(1)) // 1

    // メソッドを変数と保持する
    // この場合、レシーバーは束縛される
    // 上で定義したtがレシーバーで参照される
    mv := t.Mv
    mp := (&t).Mp
    fmt.Println(mv(0)) // 0
    fmt.Println(mp(1)) // 1

    // レシーバーを束縛しなくても良い
    // ただ、呼出し時に第1引数として必要になる
    mv_ := (T).Mv
    mp_ := (*T).Mp
    fmt.Println(mv_(t, 0))  // 0
    fmt.Println(mp_(&t, 1)) // 1
}
  • このメソッドバリューはテストコードで活用することが出来る。
  • テスト時に非公開なメソッドへのアクセスを許可することが出来る。
  • (詳しくはメルカリさんの記事で紹介されているので割愛します。)

参考