类型别名和自定义类型
1 类型别名和原类型本质上是一样的,而自定义类型可以给其添加新的方法,
package main import "fmt" //将int定义为自定义类型MyInt1 type MyInt1 int type MyInt2 = int //SayHello 为MyInt1添加一个SayHello的方法 func (m MyInt1) SayHello() { fmt.Println("Hello, 我是一个int。") } // 无法为类型别名添加方法,MyInt2只在代码中存在,编译完成时不会有该类型,并且不能为其添加方法 //func (m MyInt2) SayHello() { // fmt.Println("Hello, 我是一个int。") //} func main() { var m1 MyInt1 m1.SayHello() //Hello, 我是一个int。 m1 = 100 fmt.Printf("%#v %T\n", m1, m1) //100 main.MyInt }
所以类型别名和类型定义最大的区别在于:类型别名和原类型是相同的,而类型定义和原类型是不同的两个类型。
还有一个重要的区别在于类型定义的类型的方法集和原始类型的方法集没有任何关系,而类型别名和原始类型的方法集是一样的
参考:https://fenggolang.github.io/2018/09/golang%E4%B8%AD%E7%B1%BB%E5%9E%8B%E5%88%AB%E5%90%8D%E4%B8%8E%E7%B1%BB%E5%9E%8B%E5%86%8D%E5%AE%9A%E4%B9%89/
2 类型再定义后类型的方法集和潜在类型(即原先的类型)的方法集是一样的,博客里写错了,
import "fmt" type s1 struct { name string } func (s1) sayName(name string) { fmt.Println("my name is " + name) } type s2 = s1 func main() { a := s1{name: "Tom"} a.sayName(a.name) b := s2{name: "Jack"} b.sayName(b.name) }
tt