Golang:接口(interface)
Go中没有class的概念。Go 语言中使用组合实现对象特性的描述。对象的内部使用结构体内嵌组合对象应该具有的特性,对外通过接口暴露能使用的特性。
Go 语言的接口设计是非侵入式的,接口不知道接口被哪些类型实现。而实现不用指明具体实现哪一个接口。编译时时编译器会指明使用哪个类型实现哪个接口。
只有让接口和实现解耦,编译速度才能真正提高,项目之间的耦合度也会降低不少。
很多其他语言实现接口时,是必须指定接口的。
实现接口
只有接口的方法名,参数,返回值都在某一类型中对应上,我们才说这个类型实现了接口。
package main import (
"fmt"
) // interface
type Animal interface {
Cry(data interface{}) error
} // stuct
type Cat struct {
} func (cat *Cat) Cry(data interface{}) error {
fmt.Println("Mi:", data)
return nil
}
func main() {
cat := new(Cat)
var animal Animal
animal = cat
animal.Cry("Ao")
}
在16行Cat实现了Animal的唯一方法,所以在23,14行我们可以使用animal调用cat的方法。
sort.Interface
sort.interface是Go内置的一个帮助排序的接口。接口的定义如下
// A type, typically a collection, that satisfies sort.Interface can be
// sorted by the routines in this package. The methods require that the
// elements of the collection be enumerated by an integer index.
type Interface interface {
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}
其中包含排序需要的:数量(Len)、比较(Less)、交换(Swap)
实现接口
package main import (
"fmt"
"sort"
) type IntList []int func (i IntList) Len() int {
return len(i)
}
func (i IntList) Less(a, b int) bool {
return i[a]% < i[b]%
}
func (i IntList) Swap(a, b int) {
i[a], i[b] = i[b], i[a]
}
func main() {
ints := IntList{, , , , , , , }
sort.Sort(ints)
for _, v := range ints {
fmt.Printf("%s\n", v)
}
}
这个代码并不复杂,主要看清除4行即可。打印结果
%!s(int=)
%!s(int=)
%!s(int=)
%!s(int=)
%!s(int=)
%!s(int=)
%!s(int=)
%!s(int=)
使用sort.Slice进行切片元素排序
sort.Slice() 函数进行更为简便的排序方法,把上面的代码稍微整理之后:
package main import (
"fmt"
"sort"
) type IntList []int func main() {
ints := IntList{, , , , , , , }
sort.Slice(ints, func(i, j int) bool { return ints[i]% < ints[j]%
})
for _, v := range ints {
fmt.Printf("%s\n", v)
}
}
Golang:接口(interface)的更多相关文章
- Golang 接口interface
接口interface 接口是一个或多个方法签名的集合 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这成为Structural Typing 接口只有方法声明,没 ...
- Golang接口(interface)三个特性(译文)
The Laws of Reflection 原文地址 第一次翻译文章,请各路人士多多指教! 类型和接口 因为映射建设在类型的基础之上,首先我们对类型进行全新的介绍. go是一个静态性语言,每个变量都 ...
- 【Golang】Go 通过结构(struct) 实现接口(interface)
一.通过结构(struct) 实现 接口(interface) 1.在了解iris框架的时候,经常看到有这样去写的使用一个空结构体作为接收器,来调用方法,有点好奇这样做有什么意义. 解释:在 Go 语 ...
- Golang的Interface是个什么鬼
问题概述 Golang的interface,和别的语言是不同的.它不需要显式的implements,只要某个struct实现了interface里的所有函数,编译器会自动认为它实现了这个interfa ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Go 接口(interface)
文章转载地址:https://www.flysnow.org/2017/04/03/go-in-action-go-interface.html 1.什么是 interface? 简单的说,i ...
- golang的interface剖析
背景: golang的interface是一种satisfied式的.A类只要实现了IA interface定义的方法,A就satisfied了接口IA.更抽象一层,如果某些设计上需要一些更抽象的 ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- 【Golang 接口自动化06】微信支付md5签名计算及其优化
前言 可能看过我博客的朋友知道我主要是做的支付这一块的测试工作.而我们都知道现在比较流行的支付方式就是微信支付和支付宝支付,当然最近在使用低手续费大力推广的京东金融(已改名为京东数科)以后也可能站到第 ...
- Golang 接口与反射知识要点
目录 Golang 接口与反射知识要点 1. 接口类型变量 2. 类型断言 3. 鸭子类型 4. 反射机制 5. reflect 包 TypeOf().ValueOf() Type().Kind() ...
随机推荐
- arc 097 E - Sorted and Sorted
E - Sorted and Sorted Time limit : 2sec / Memory limit : 1024MB Score : 600 points Problem Statement ...
- java.lang.IllegalArgumentException: Document base XXX does not exist or is not a readable directory解决方法
一.配置Eclipse,部署项目 1.双击打开Tomcat设置页面 2.选择Modules模式 3.选择Add External Web Module.. (1)Document base:选择htd ...
- Why the Anaconda command prompt is the first choice in windows?
为什么在windows里,首选的conda命令行工具是Anaconda command prompt? In windows, what's the difference between comman ...
- thinkPHP nginx无论怎样访问都会访问index方法解决
修改项目配置文件 application/config.php中的 pathinfo_fetch的末尾增加 REQUEST_URI 详情参考:https://www.colabug.com/35205 ...
- Python第4天
主要内容: 数字(int) 字符串(replace/find/join/strip/startswith/split/upper/lower/format) 列表 append/extend/inse ...
- laravel5.6中Session store not set on request问题如何解决
先找到文件app下的Kernel.php文件,在文件中加入下列代码 protected $middleware = [ \Illuminate\Foundation\Http\Middleware\C ...
- chrome浏览器 新建 标签 页面 跳转到主页(或跳转到谷歌)
我的浏览器是跳转到自己设置的主页.我在贴吧看到的以下方式,然后就可以了: 地址栏输入 chrome://flags 搜索 Enable doodles on the local NTP 这一项改为di ...
- [RUNOOB]C++继承
REF: http://www.runoob.com/cplusplus/cpp-inheritance.html 一.基类和派生类 程序: #include "stdafx.h" ...
- 不同应用共享redis应用,但分数据库存储数据
日常开发工作中,常常遇到这种情况 项目A ,需要使用redis 项目B ,也需使用redis …… 原来傻乎乎的在服务器上装几个redis,通过不同的端口号来进行使用 其实redis可用有16个数据库 ...
- 吴裕雄 python 机器学习——Lasso回归
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model from s ...