go的函数类型
函数字面量类型的语法表达格式是 func (InputTypeList) OutputTypeList
, “有名函数”和“匿名函数”的类型都属于函数字面量类型,有名函数的定义相当于初始化一个函数字面量类型后将其赋值给一个函数名变量,“匿名函数”的定义也是直接初始化一个函数字面量类型,只是没有绑定到一个具体函数名变量上。从 Go 类型系统的角度来看,“有名函数”和“匿名函数”都是函数字面量类型的实例。可以使用 type NewType OldType
语法定义一种新类型,这种类型都是命名类型,同理可以使用该方法定义一种新类型——函数命名类型,简称函数类型,例如:type NewFuncType FuncLiteral
依据Go语言类型系统的概念,NewFuncType 为新定义的函数命名类型,FuncLiteral 为函数字面量类型,FuncLiteral 为函数类型 NewFuneType 的底层类型。
示例: 如下声明了一个 CalculateType 函数类型,并实现 Serve() 方法,并将拥有相同参数的 add 和 mul 强制转换成 CalculateType 函数类型,同时这两个函数都拥有了 CalculateType 函数类型的 Serve() 方法。
package main
import "fmt"
type CalculateType func(int, int) // 声明了一个函数类型
// 该函数类型实现了一个方法
func (c *CalculateType) Serve() {
fmt.Println("我是一个函数类型")
}
// 加法函数
func add(a, b int) {
fmt.Println(a + b)
}
// 乘法函数
func mul(a, b int) {
fmt.Println(a * b)
}
func main() {
a := CalculateType(add) // 将add函数强制转换成CalculateType类型
b := CalculateType(mul) // 将mul函数强制转换成CalculateType类型
a(2, 3)
b(2, 3)
a.Serve()
b.Serve()
}
// 5
// 6
// 我是一个函数类型
// 我是一个函数类型
go的接口实现类型
- 值接收者实现接口: 使用值接收者实现接口之后,不管是结构体还是结构体指针类型的变量都可以赋值给该接口变量。因为Go语言中有对指针类型变量求值的语法糖,结构体指针在内部会自动求值解引用指针。
type Mover interface {
move()
}
type dog struct {}
//值接收者实现接口
func (d dog) move() {
fmt.Println("狗会动")
}
//此时实现接口的是dog类型:
func main() {
var x Mover
var wangcai = dog{} // 旺财是dog类型
x = wangcai // x可以接收dog类型
var fugui = &dog{} // 富贵是*dog类型
x = fugui // x可以接收*dog类型
x.move()
}
- 指针接收者实现接口: 实现接口的若是结构体的指针类型,则不能把值类型传给接口,此时接口只能存储结构体指针类型的值。
func (d *dog) move() {
fmt.Println("狗会动")
}
func main() {
var x Mover
var wangcai = dog{} // 旺财是dog类型
x = wangcai // x不可以接收dog类型
var fugui = &dog{} // 富贵是*dog类型
x = fugui // x可以接收*dog类型
}