go学习(四、面向接口)

4.1 接口

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

4.1.1 接口定义和使用

我们来看看接口的定义:

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

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

先来看下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))
}

接下来我们看看mock.go

package mock

type Retiever struct {
	Contents string
}

func (r Retiever)Get(url string) string {    // 就是一个简单的实现get方法
	return r.Contents
}

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)
}

接下来看一波打印:

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

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

func (r *Retiever)Get(url string) string {
	return r.Contents
}

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

r = &mock.Retiever{"this is test"}
//fmt.Println(download(r))

fmt.Printf("%T %v\n", r, r)

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

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

real := r.(real.Retiever)
fmt.Println(real.TimeOut)

4.1.4 go语言的任意类型

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

可以当做go语言的泛型。

type Queue []interface{}		// 定义一个任意类型的切片

func (q *Queue) push(Value interface{}) {
	*q = append(*q, Value)
}
var q Queue
q.push(1)
q.push("adv")

fmt.Println(q)   // 调用的函数

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
}

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

4.1.6 常用系统接口

Stringer() 通过fmt.Println打印

Reader()

Writer()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值