Underlying type — базовый тип, на котором построен твой тип. Для type MyInt int underlying type будет int. Для type MySlice []string — []string. Это важно для type conversion: можно конвертировать между типами с одинаковым underlying type без unsafe. Также underlying type определяет, какие операции доступны — MyInt можно складывать, потому что underlying type int поддерживает +. В generics constraint ~int означает "любой тип с underlying type int".