Для ясности в терминах, это оба объявления типа .
type A = string
Это называется объявлением псевдонима. Т.е. вы создаете псевдоним для типа. По сути, нет никакой разницы между типом и псевдонимом. Вы можете определить методы для псевдонима, и они будут доступны для начальных экземпляров типов. Пример :
type A struct {}
type B = A
func (B) print() {
fmt.Println("B")
}
func main() {
a := A{}
b := B{}
a.print() // OUTPUT: B
b.print() // OUTPUT: B
}
Хотя, в вашем конкретном примере type A = string
вы не можете определить методы для него, потому что строка имеет нелокальный тип (было предложение чтобы добавить возможность создавать методы для нелокальных типов, но он был отклонен).
Ваш второй случай type A string
- это определение типа. По сути, это создание нового типа, который имеет все поля исходного типа, но не его методы. Пример :
type A struct {}
func (A) print() {
fmt.Println("A")
}
type B A
func (B) print() {
fmt.Println("B")
}
func main() {
a := A{}
b := B{}
a.print() // OUTPUT: A
b.print() // OUTPUT: B
}