When thinking about Go it's best to avoid concepts that do not apply,
like derived class, upcast, and downcast. You can't write
d.testUnderlyingTypeAsReceiver() because the method is only defined on
the type S, and d is type []int, not type S. Passing d to
testUnderlyingTypeAsParam works because a value of an unnamed type is
assignable to a value of a named type when the underlying type of the
named type is the same as the unnamed type. There is no upcasting or
downcasting involved. There is just simple assignment.
Ian