¿Por qué la firma del método tiene que coincidir perfectamente con el método de la interfaz?

Empecé a aprender Go y tengo problemas para comprender lo siguiente:

package main

import "fmt"

type I interface {
    foo(interface {})
}

type S struct {}

func (s S) foo(i int) {
    fmt.Println(i)
}

func main() {
    var i I = S{}
    i.foo(2)
}

Esto falla con:

cannot use S literal (type S) as type I in assignment:
        S does not implement I (wrong type for foo method)
                have foo(int)
                want foo(interface {})

No entiendo por qué Go no acepta elfoo(int) firma dado el hecho de queint implementosinterface {}. ¿Alguien puede ayudar con una explicación?

Respuestas a la pregunta(2)

Su respuesta a la pregunta