empty_interface
package mainimport "fmt"//type Empty interface {//}type Course struct { name string price int url string}type Printer interface { printInfo() string}func (c Course) printInfo() string { return "课程信息"}//func print(x interface{}) {// //此处的ok是bool类型// if v, ok := x.(int); ok { //判断是不是int类型// //x是int类型// fmt.Printf("%d, 整数\n", v)// }//// if s, ok := x.(string); ok {// fmt.Printf("%s,字符串\n", s)//// }// //牵扯到go的另一个默认的问题// //fmt.Printf("%v\n ", i)//}type AliOss struct { //保存 //下载}type LocalFile struct {}func store(x interface{}) { switch v := x.(type) { case AliOss: //此处要做一些特殊的处理,比如设置阿里云的权限问题 fmt.Println(v) case LocalFile: //检查路径的权限 fmt.Println(v) }}func print(x interface{}) { //类型断言 switch x := x.(type) { case string: fmt.Printf("%s,字符串\n", x) case int: fmt.Printf("%d, 整数\n", x) case float64: fmt.Printf("%f, 浮点数\n", x) }}func main() { //空接口 var i interface{} //有点像多态 //空接口可以类似于我们java和python中的object //i = Course{} //fmt.Println(i) i = 10 print(i) i = "hello" fmt.Println(i) //i = []string{"django", "scrapy"} //fmt.Println(i) //1.空接口的第一个用途,可以把任何类型都赋值给空接口变量 //2.参数传递 什么类型都可以打印 什么类型都可以接收 //3.空接口可以作为map的值 //var teacherInfo = make(map[string]interface{}) //teacherInfo["name"] = "wozen" //teacherInfo["age"] = 18 //teacherInfo["weight"] = 72.5 //teacherInfo["courses"] = []string{"hello", "world"} //fmt.Printf("%v\n", teacherInfo) //类型断言 //接口的一个坑, 接口引入了 //接口还有一个默认的规范 接口的名称以 er 结尾 //c := &Course{} //var c Printer = Course{} //c.printInfo() //fmt.Println()}
interface_test
package mainimport ( "fmt")// Programmer 接口是一个协议 - 程序员 - 只要你能够1.写代码 2.解决bug 其实就是一组方法的集合type Programmer interface { Coding() string //方法只是声明 Debug() string}type Designer interface { Design() string}type Manager interface { Programmer Designer Manage() string}type G struct {}type Pythoner struct { UIDesigner lib []string kj []string years []int}// Java的话 java里面一种类型只要继承一个接口才行 如果你继承了这个接口的话 那么这个接口里面的所有方法你必须要全部实现type UIDesigner struct {}func (d UIDesigner) Design() string { fmt.Println("我会UI设计") return "我会UI设计"}func (p G) Coding() string { fmt.Println("go开发者") return "go开发者"}func (p G) Debug() string { fmt.Println("我会 go 的debug") return "我会go的debug"}func (p Pythoner) Coding() string { fmt.Println("python开发者") return "python开发者"}func (p Pythoner) Debug() string { fmt.Println("我会python的debug") return "我会python的debug"}func (p Pythoner) Manage() string { fmt.Println("不好意思,管理我也懂") return "不好意思,管理我也懂"}//func (p Pythoner) Design() string {// fmt.Println("我是一个python开发者,但是我会搞UI设计")// return "我是一个python开发者,但是我会搞UI设计"//}//对于 Pythoner 这个结构体来说 你实现任何方法都可以 但是你只要不全部实现这两个方法 那么你Pythoner结构体就不是一个Programmer类型//1.Pythoner本身自己就是一个类型 那我何必在意我是不是Programmer//2.封装 继承 多态 -多态的概念对于很多 Pythoner来说会有点陌生//3.在讲解多态之前,我们来对interface做一个说明:在go语言中接口是一种类型 是一种抽象类型func HandlePy(pythoner Pythoner) {}func HandleGo(g G) {}//func HandleJava(pythoner Pythoner) {////}type myError struct {}func (m myError) Error() string { return "错误"}func main() { //新的语言出来了 接口帮我们完成了go语言的多态 //var pro Programmer = Pythoner{} //var g G = G{} //pro.Coding() var pros []Programmer pros = append(pros, Pythoner{}) pros = append(pros, G{}) //接口虽然是一种类型 但是和其他类型不太一样 接口是一种抽象类型 struct 是具象 p := Pythoner{} fmt.Printf("%T\n", p) var pro Programmer = Pythoner{} var pro2 Programmer = G{} fmt.Printf("%T\n", pro) fmt.Printf("%T\n", pro2) //如果大家对于面向对象理解的话 java 里面的抽象类型有点像 //1. go struct 组合 组合一起实现了所有的接的方法也是可以的 //2.接口本身也支持组合 var m Manager = Pythoner{} //struct 组合完成了接口 1.接口支持组合 - 继承2.结构体组合实现了所有的接口方法也没有问题 m.Design() //python语言本身设计上是采用了完全的基于鸭子类型 - 协议 影响了python语法的for len() //go语言也推荐鸭子类型 error //var err error = error() //并不能实例化 抽象类型 //var err error = myError{} //var err error = errors.New("错误") s := "文件不存在" var err error = fmt.Errorf("错误:%s", s) fmt.Println(err)}//开发中经常会遇到的问题//开发一个电商网站 支付环境 wx zfb yhk 你的系统支持各种类型的支付 每一种支付类型都有统一的接口//定一个协议 1. 支付 2.创建订单 3.查询支付状态 4.退款//支付发起了//type AliPay struct {//}////type WeChat struct {//}//type Bank struct {//}////var b Bank//var a AliPay//var w WeChattype Tongyong struct {}//多态 声明类型的时候你声明的类型是一种兼容类型,但是实际赋值的时候是另一种类型//接口是强制性//你现在有一个缓存系统 - 这个地方你一开始使用的缓存是redis 但是后期你考虑到可能使用其他的缓存技术 - 本地 memcache/* var x Tongyong x = Bank{} x = AliPay{} x = WeChat{} x.pay x.create x.query*///这种多态特性 其实在python中不需要多态 python是动态语言//go语言中并不支持继承//如果后期接入一种新的支付 或者取消已有的支付
sort_test
package mainimport ( "fmt" "sort")type Course struct { Name string Price int Url string}type Courses []Coursefunc (c Courses) Len() int { return len(c)}func (c Courses) Less(i, j int) bool { return c[i].Price < c[j].Price}func (c Courses) Swap(i, j int) { c[i], c[j] = c[j], c[i]}func main() { //通过sort来排序 //让你写一个排序算法 冒泡 快速 桶 归并 桶排序 算法本质是一样的 比较 计数排序 //你的排序算法是否能应付各种类型的排序 courses := Courses{ Course{"django",300,""}, Course{"scrapy",100,""}, Course{"go",150,""}, Course{"tornado",200,""}, } sort.Sort(courses) //协议 你的目的不是要告诉别人具体的类型,重要的是你的类型必须提供具体的方法 for _ , v := range courses { fmt.Println( v) } //data := []int{1, 3, 6, 7, 2} //sort.Sort(data) //协议 /* 无法将 'data' (类型 []int) 用作类型 Interface 类型未实现 'Interface', 因为缺少某些方法: Len() int Less(i int, j int) bool Swap(i int, j int) */ //grpc //go语言的包以及编码规范 包管理 1.12之前 python java maven go-modules}