The terminology we would generally use is '*dog' is a pointer, not a "type address".
The difference really has nothing to do with structs, but is the difference between a value and a pointer to a value. If you understand pointers in general, then this more complicated case will make sense. I suggest searching "pointers in go explained", which will give you a number of tutorials that explain pointers.
In this case, the biggest difference is that each instance of B will always contain its own 'dog' value, but instances of A may share a 'dog' value, if d points to the same 'dog' value. Seehttps://
go.dev/play/p/NlSsMc8b7To for a demonstration.