go语言里,interface的地位举足轻重,可谓是go语言的灵魂。下面通过两个例子说明interface的使用。
示例一
package main
import (
"fmt"
"strconv"
)
type sdxp struct{
index int
name string
}
type idriver interface{
driver1()string
driver2()string
}
func driver1()(string){
fmt.Println("i am driver1,i drive a car.")
return "driver1"
}
func driver2()(string){
fmt.Println("i am driver2,i drive a traffic.")
return "driver2"
}
func (s sdxp) driver1()(string){
fmt.Println(s.name,"is a driver.")
s.index = 3
return "driver"+strconv.Itoa(s.index)
}
func (s *sdxp) driver2()(string){
fmt.Println(s.name,"is a driver.")
s.index = 5
return "driver"+strconv.Itoa(s.index)
}
func Woker1(name string,num int){
var sw sdxp
var ssw *sdxp
sw.index = num
sw.name = name
ssw = &sw
driver1()
driver2()
fmt.Println("index is:",sw.index)
sw.driver1()
fmt.Println("index is:",sw.index)
ssw.driver2()
fmt.Println("index is:",sw.index)
}
func main() {
Woker1("laowang",1)
}
这段代码展示了interface的几个实现:
18-26行、用函数实现interface;
28-32行、用接收者是副本的方法实现interface;
34-38行、用接收者是引用的方法实现interface。
运行结果打印如下:
E:\work\go\src\tinterface>main.exe
i am driver1,i drive a car.
i am driver2,i drive a traffic.
index is: 1
laowang is a driver.
index is: 1
laowang is a driver.
index is: 5
示例二
package main
import (
"fmt"
"strconv"
)
type sdxp struct{
index int
name string
}
type sdxh struct{
index int
name string
}
type iworker interface{
driver1()string
driver2()string
}
func (s sdxp) driver1()(string){
fmt.Println(s.name,"is a driver,he drive a car.")
s.index = 3
return "driver1"+strconv.Itoa(s.index)
}
func (s sdxp) driver2()(string){
fmt.Println(s.name,"is a driver2,he drive a traffic")
s.index = 4
return "driver2"+strconv.Itoa(s.index)
}
func (s *sdxh) driver1()(string){
fmt.Println(s.name,"is a driver,he drive a car")
s.index = 5
return "driver1"+strconv.Itoa(s.index)
}
func (s *sdxh) driver2()(string){
fmt.Println(s.name,"is a driver,he drive a traffic")
s.index = 6
return "driver2"+strconv.Itoa(s.index)
}
func Woker1(name string,num int){
var iw1,iw2 iworker
var dxp sdxp
var dxh sdxh
dxp.index = num
dxp.name = name
dxh.index = num
dxh.name = name
iw1 = dxp
iw2 = &dxh
iw1.driver1()
fmt.Println("index is:",dxp.index)
iw1.driver2()
fmt.Println("index is:",dxp.index)
iw2.driver1()
fmt.Println("index is:",dxh.index)
iw2.driver2()
fmt.Println("index is:",dxh.index)
}
func main() {
Woker1("laowang",1)
}
这段代码的执行结果如下:
E:\work\go\src\tinterface1>main.exe
laowang is a driver,he drive a car.
index is: 1
laowang is a driver2,he drive a traffic
index is: 1
laowang is a driver,he drive a car
index is: 5
laowang is a driver,he drive a traffic
index is: 6
对比可以发现,示例一和示例二有一定的差别,driver1和driver2的实现方式不同,这主要是因为在Worker1函数的调用方式不同。
以示例一的方式实现时,没有严格的编译检查,以示例二的方式实现,不定义任何一个driver1或driver2都会编译报错,甚至按照示例一的28-38行的方式实现也会报错。