简介
Go语言中函数和方法的区别:
函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。
方法就是一个包含了接收者的函数。接收者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。
接口:
Go语言的接口是隐式实现的。
interface是方法声明的集合。
任何类型的对象实现了interface接口中声明的全部方法,则算实现了该接口。
interface可以作为一种数据类型,实现了该接口的任意类型的对象都可以给该接口类型的变量赋值。
接口只是一种约束条件,我们不需要显式的调用。某个类型实现了它约束的方法,就说明它已经实现了该接口,他就可以当做该接口使用了。
比如我们实现一套针对某个接口的一组函数,只要实现了该接口约定方法的任意类型,都可以使用这一组函数。而不需要其他类型重新实现这一套函数了。
type 接口名字 interface {
方法名1(参数)(返回值)
方法名2(参数)(返回值)
...
//这里有几个方法,类型必须实现几个同名方法,否则不算实现了该接口
}
简单使用
比如,我们实现一组加减乘除的函数,传入的参数是一个接口;
该接口约束一个方法:获取运算的两个变量;
只要实现了该约束的任意类型,都可以当做该接口传入这一组加减乘除的函数中被运算。
这里结构体element
,只要实现了getElement
方法,就可以被当做接口Operation
被传入加减乘除这四个函数被使用。
这样,我们就可以只实现加减乘除这四个函数,其他类型只要想用这四个函数,只需要实现接口element
约束的方法getElement
即可。
package main
import (
"fmt"
)
type Operation interface{
getElement()(a,b int)//返回用于运算的两个变量
}
// 加法
func Addition(opt Operation)int{
a,b:=opt.getElement()
return a+b
}
// 减法
func Subtraction(opt Operation)int{
a,b:=opt.getElement()
return a-b
}
// 乘法
func Multiplication(opt Operation)int{
a,b:=opt.getElement()
return a*b
}
// 除法
func Division(opt Operation)int{
a,b:=opt.getElement()
if b!=0{
return a/b
}
return 0
}
type element struct{
InputA int
InputB int
Result int
}
func (ele *element)getElement()(int,int){
return ele.InputA,ele.InputB
}
func main() {
e:=&element{InputA:2,InputB:3}
fmt.Println(Addition(e)) //5
fmt.Println(Subtraction(e))//-1
fmt.Println(Multiplication(e))//6
fmt.Println(Division(e))//0
}
在外部包定义接口的时候,记得区分首字母大小写。