Yes, of course. It declares a new named type X, the underlying
type is Y which can be some predeclared type like int, some
other named declared type (like MyFooType) or a "type literal"
(a term I made up) like struct{X,Y float64; T string} or
map[string]bool or chan time.Time .
The main reason to declare a new type like
type NewType SomeExistingType
is that NewType starts of with an empty method set and you
can implement totally different methods on it or even implement
the methods with the same name but with different signatures
and/or different semantics.
Type aliases are necessary e.g. during refactoring large code
bases or to provide a certain compatibility. Do not use them
in "regular" code as they do not provide any value but make
reading the code harder.
You might want to read more about "embedding" one type into
a struct type: Grep the Spec for "embedded field". Embedding
allows to have a new type with potentially different method set
but reuse methods of the embedded type.
V.