赞
踩
type InterfaceName interface {
//方法列表
}
type LessAdder interface {
Less(INTEGER) bool
Add(INTEGER)
}
type INTEGER int
func (a INTEGER) Less(b INTEGER) bool {
return a < b
}
func (a *INTEGER) Add(b INTEGER) {
*a += b
}
package main
import "fmt"
type LessAdder interface {
Less(INTEGER) bool
Add(INTEGER)
}
type INTEGER int
func (a INTEGER) Less(b INTEGER) bool {
return a < b
}
func (a *INTEGER) Add(b INTEGER) {
*a += b
}
func main() {
var a INTEGER = 10
var b LessAdder = a //有问题
fmt.Println(b.Less(20))
b.Add(40)
fmt.Println(a)
}
C:/go/bin/go.exe run test.go [E:/project/go/lx/src]
# command-line-arguments
.\test.go:23: cannot use a (type INTEGER) as type LessAdder in assignment:
INTEGER does not implement LessAdder (Add method has pointer receiver)
错误: 进程退出代码 2.
e.g.
package main
import "fmt"
type LessAdder interface {
Less(INTEGER) bool
Add(INTEGER)
}
type INTEGER int
func (a INTEGER) Less(b INTEGER) bool {
return a < b
}
func (a INTEGER) Add(b INTEGER) { //该方法修改的是形参a的值,并没有真正修改main函数中的变量a
a += b
}
func main() {
var a INTEGER = 10
var b LessAdder = a
fmt.Println(b.Less(20))
b.Add(40)
fmt.Println(a)
}编译运行:
C:/go/bin/go.exe run test.go [E:/project/go/lx/src]
true
10
成功: 进程退出代码 0.
OK,这次编译通过,但是这段代码是有问题的,参见代码注释。
类型*T的对象赋值给接口变量时,类型T的方法接收器类型可以是T或者*T
e.g.
package mainimport "fmt"type LessAdder interface {Less(INTEGER) boolAdd(INTEGER)
}type INTEGER intfunc (a INTEGER) Less(b INTEGER) bool { //接收器类型为INTEGERreturn a < b}func (a *INTEGER) Add(b INTEGER) { //接收器类型为*INTEGER*a += b}func main() {var a INTEGER = 10var b LessAdder = &afmt.Println(b.Less(20))b.Add(40)fmt.Println(a)
}编译运行:
C:/go/bin/go.exe run test.go [E:/project/go/lx/src]
true
50
成功: 进程退出代码 0.
OK。从上面的代码可以看出,当接口变量的值是*T时,接收器的类型可以是T或*T
在golang中,只要两个接口具有相同的方法列表,那么他们就是等同的,就可以相互赋值;
如果一个接口的方法列表包含了另一个接口的方法列表,那么可以将大的接口变量赋值给小的接口变量。
e.g.
package onetype ReadWriter interface {Read(buff []byte) (n int, err error)Write(buff []byte) (n int, err error)}package twotype IStream interface {Write(buff []byte) (n int, err error)Read(buff []byte) (n int, err error)}上面定义的接口one.ReadWriter和two.IStream就是等价的,对应的接口变量可以相互赋值。
var file1 one.ReadWriter=new(os.File)var file2 two.IStream=file1var file3 one.ReadWriter=file2
e.g.
package threetype Writer interface {Write([]byte) (int, error)}上面定义的Writer接口是one.ReadWriter和two.IStream接口的子接口,所以可以将one.ReadWriter和two.IStream类型变量赋值给three.Writer接口变量。var file1 one.ReadWriter=new(os.File)var file2 three.Writer=file1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。