• go学习(四、面向接口)


    4.1 接口

    go语言是支持接口的,因为现在的编程逻辑基本都是基于接口。

    4.1.1 接口定义和使用

    我们来看看接口的定义:

    // 接口的定义
    type Retiever interface {
        Get(url string) string     // 接口里面全是函数
    } 
    
    • 1
    • 2
    • 3
    • 4

    接口定义还是比较简单的,那接下来我们看看是怎么使用的:

    先来看下main.go:

    package main
    
    import (
    	"fmt"
    	"./mock"
    	"./real"
    )
    
    type Retiever interface {
    	Get(url string) string
    }
    
    func download(r Retiever) string {
    	return r.Get("http://www.imooc.com")
    }
    
    func main() {
    	var r Retiever    // 这个定义一个接口变量
    	r = mock.Retiever{"this is test"}   // 然后直接用这个对象赋值给r
    // 因为go没有继承没有多态,所以接口只要包含同一个函数就可以直接赋值,好像确实方便了不少
    	fmt.Println(download(r))   // 函数调用
    
    	r = real.Retiever{}
    	fmt.Println(download(r))
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    接下来我们看看mock.go

    package mock
    
    type Retiever struct {
    	Contents string
    }
    
    func (r Retiever)Get(url string) string {    // 就是一个简单的实现get方法
    	return r.Contents
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.1.2 接口的总结

    go的接口没有c++的继承,也没有java的实现,是一个隐式的实现,就是只要实现了接口中的函数,就可以赋值给这个接口的类型,这样虽然写的很快,但是会不会乱呢?这个需要我们在以后使用过程中才看了。

    4.1.3 接口的值类型

    跟着这个老师学习,还要学习接口类型的值是怎么样,这个我们在c++学习中就没想过,这个以后搞c++的时候,可以分析一下。

    func main() {
    	var r Retiever
    	r = mock.Retiever{"this is test"}
    	//fmt.Println(download(r))
    
    	fmt.Printf("%T %v\n", r, r)
    
    
    	r = real.Retiever{}
    	//fmt.Println(download(r))
    
    	fmt.Printf("%T %v\n", r, r)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    接下来看一波打印:

    mock.Retiever {this is test}   // 还真的有类型,不过都是值类型
    real.Retiever { 0s}
    
    • 1
    • 2

    改一改看看能不能改成指针类型:

    func (r *Retiever)Get(url string) string {
    	return r.Contents
    }
    
    • 1
    • 2
    • 3

    改一下这边的接收者,然后就可以改成指针类型了。

    r = &mock.Retiever{"this is test"}
    //fmt.Println(download(r))
    
    fmt.Printf("%T %v\n", r, r)
    
    • 1
    • 2
    • 3
    • 4

    另外go语言获取这个变量的类型是这样的:r.(type)

    我们还可以通过r来取到对应的值:

    real := r.(real.Retiever)
    fmt.Println(real.TimeOut)
    
    • 1
    • 2

    4.1.4 go语言的任意类型

    go语言有一个任意类型,interface{}。

    可以当做go语言的泛型。

    type Queue []interface{}		// 定义一个任意类型的切片
    
    func (q *Queue) push(Value interface{}) {
    	*q = append(*q, Value)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    var q Queue
    q.push(1)
    q.push("adv")
    
    fmt.Println(q)   // 调用的函数
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.1.5 接口组合

    type Retiever interface {
    	Get(url string) string
    }
    
    type Post interface {
    	Post(url string, from map[string]string)
    }
    
    type all interface {
    	Retiever
    	Post
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这样就是接口的组合,确实比较简单,然后实现的类,需要把两个接口函数都实现了,才行。

    4.1.6 常用系统接口

    Stringer() 通过fmt.Println打印

    Reader()

    Writer()

    系统常用接口,需要以后编程中,再熟悉熟悉了。

  • 相关阅读:
    统计目录下的文件数量
    前端跨域解决方案
    快速傅里叶变换FFT在MATLAB中的实现
    JavaWeb搭建学生管理系统(手把手)
    【c++】打家劫舍(动态规划)
    uni-app下,页面跳转后wacth持续监听的问题处理
    vue element ui 打开弹窗出现黑框问题
    VEX —— Functions|Transforms and Space
    [LeetCode周赛复盘] 第 318 场周赛20221107
    MySQL 深度分页性能急剧下降,该如何优化?
  • 原文地址:https://blog.csdn.net/C1033177205/article/details/125512291