GO语言中的接口相比较java而言简单了许多,GO语言的接口独特的地方在于它是隐式实现的。对于一个具体的类型而言,它无需声明具体实现了哪些接口,只要它实现了接口对应的方法,那么它就实现了该接口。如果一个类型要实现一个接口,那么它必须实现接口中所有的方法。下面我们看一段代码:
// stydy project main.go
package main
import (
"fmt"
"strconv"
)
type River interface {
GetName() string
GetLength() float64
GetLocation() string
}
type YellowRiver struct {
Name string
Length float64
Location string
}
type YangtzeRiver struct {
YName string
YLength float64
YLocation string
}
func (yr YellowRiver) GetName() string {
return yr.Name
}
func (yr YellowRiver) GetLength() float64 {
return yr.Length
}
func (yr YellowRiver) GetLocation() string {
return yr.Location
}
func (yr YellowRiver) ToString() string {
return yr.Name + strconv.FormatFloat(yr.Length, 'f', 3, 64) + yr.Location
}
func (YteR YangtzeRiver) GetName() string {
return YteR.YName
}
func GetRiverInfo(r River) {
fmt.Println(r.GetName(), r.GetLength(), r.GetLocation())
}
func main() {
yr := YellowRiver{"黄河", 5464.0, "中国"}
yter := YangtzeRiver{"长江", 5464.0, "中国"}
GetRiverInfo(yr)
fmt.Println(yter.GetName())
//GetRiverInfo(yter)
}
上面代码中定义了两个结构体,长江和黄河,YellowRiver实现了River的所有的方法,所以调用GetRiverInfo方法是可以的,但是YangtzeRiver没有实现它所有的方法,所以调用GetRiverInfo时异常。
空接口类型:
空接口类型对类型没有任何要求,所以可以把任何值赋给它。看下面一段代码:
// client project main.go
package main
import (
"fmt"
"math"
)
type inter interface{}
func MyPrint(param inter) {
fmt.Println(param)
}
func main() {
var x interface{}
x = 55
x = "abc"
x = math.Pi
MyPrint(x)
}
类型断言,类型断言是一个作用在接口值上的操作,x.(T),x是一个接口的表达式,T是一个类型。类型断言可以判断操作数据的类型是否是指定的类型。
// client project main.go
package main
import (
"fmt"
)
//判断参数类型
func JudgeParamType(param interface{}) string {
if param == nil {
return "param is nil"
} else if _, ok := param.(int); ok {
return "int"
} else if _, ok := param.(float64); ok {
return "float64"
} else {
return "unknown"
}
}
func main() {
r := JudgeParamType(32.0)
fmt.Println(r)
}