GOで 構造体に定義したメソッドと埋め込みされたメソッドが同じシグニチャで無限ループに遭遇した

  • 以下実装で発生していた
    type SampleService struct {
        repository.SampleRepositoryHandler
    }
    
    func (s *SampleService) TargetFunction(ctx context.Context, sampleID, exampleID string) error {
        err := s.TargetFunction(ctx, sampleID, exampleID)
        if err != nil {
            // ...
        }
    }
  • それまで異なる名前だったので、メソッド名変更を実施したタイミングで発生した為、気づかなかった

ポイント

  • 構造体埋め込み(匿名フィールド)は、委譲(delegation)として機能する
  • 埋め込んだ型のメソッドを、親構造体のメソッドとして呼び出せる
  • s.TargetFunctionSampleService のメソッドと、埋め込んだ SampleRepositoryHandler のメソッド両方を持つ
  • 名前が重複している場合は、親構造体のメソッドが優先される

解決策

  • 埋め込みで呼べたとしても、明示的に記載すべき