当前位置:网站首页>go学习(四、面向接口)
go学习(四、面向接口)
2022-06-29 14:31:00 【酱油师兄】
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()
系统常用接口,需要以后编程中,再熟悉熟悉了。
边栏推荐
- 《canvas》之第10章 canvas路径
- Redis' cache avalanche, cache breakdown, cache penetration, cache preheating, and cache degradation
- 驱动器实际运用案例
- EXCEL的查询功能Vlookup
- 中国三氧化二砷行业研究与未来预测报告(2022版)
- 在平面坐标上画斜线
- Research Report on research and development prospect of China's urea dioxide industry (2022 Edition)
- Redis的数据过期清除策略 与 内存淘汰策略
- 揭秘!付费会员制下的那些小心机!
- [top] blog instructions, bulletin board, message board, about bloggers
猜你喜欢

阿里云体验有奖:使用PolarDB-X与Flink搭建实时数据大屏

【牛客网刷题系列 之 Verilog快速入门】~ 移位运算与乘法

论文学习——考虑场次降雨年际变化特征的年径流总量控制率准确核算

传输层 用户数据报协议(UDP)

第五届中国软件开源创新大赛 | openGauss赛道直播培训

Are you still reading the log by command? Use kibana, one picture is better than ten thousand lines of log

Uniapp problem list and experience

Whitelabel error page access

华理生物冲刺科创板:年营收2.26亿 拟募资8亿

浅析 Istio——可观测性
随机推荐
Chapter 8 pixel operation of canvas
《canvas》之第13章 事件操作
三角函数对应在平面坐标上画圆
China soft ice cream market forecast and investment prospect research report (2022 Edition)
[Jenkins] pipeline controls the sequential execution of multiple jobs for timed continuous integration
Detailed explanation of redis sentry mechanism
Deploy redis sentry in k8s
期货开户可以线下开户吗?在网上开户安全吗?
Redis installation in windows and Linux Environment
Nuscenes configuration information about radar
VQA不只需要图片,还需要外部知识!华盛顿大学&微软提出提出REVIVE,用GPT-3和Wikidata来辅助回答问题!...
卫龙更新招股书:年营收48亿 创始人刘卫平家族色彩浓厚
Introduction to bloom filter
中国三氧化二砷行业研究与未来预测报告(2022版)
云上第一课 | 建个小破站有多简单?云计算老司机带你一小时搞定
MySQL中100w数据表比1000w数据表查询更快吗?
建立自己的网站(19)
openGauss社区成立SIG KnowledgeGraph
Chapter 6 picture operation of canvas
Why is redis so fast? Is redis single threaded or multi-threaded?