ただ匿名フィールドやメソッドでしっくりこない部分がいくつか

type foo struct {}
func (f foo) foobar() {}
func (f *foo) pfoobar() {}

type bar struct {
foo
}

これらのメソッドを

bar.foobar(bar)
で呼び出せたり
var nilptr *foo; foo.pfoobar() // 空なのに…
で呼び出せたりするのがなんか気持ち悪い