go的interface
go的interface应该是go语言中比较好用的一个特性了。今天说下interface常用的用法。
1.空接口 interface{}
interface是一个特殊的类型,interface{}是一个空接口,只要一个任意类型实现了接口中一个或者多个方法,那么这个类型就实现了该接口,所以一个空接口中有0个方法,所以任意类型都实现了这个interface{},因此interface{}可以接收任何值。
具体的用法如下:func main() { testInterface(1) testInterface("aaa") testInterface(0.01) var a A a.m = "m" a.n = "n" testInterface(a) } func testInterface(v interface{}) { s := fmt.Sprintf("传入的值是:%v", v) fmt.Println(s) } type A struct { m string n string }
输出结果:
2. 接口多态
只要任意类型实现了接口中的一个或者多个方法,那么这个类型的值就能够使用这个接口的变量来存储,这样可以根据这个特性实现多态。
具体的用法如下:
定义支付接口:type Pay interface { GetAccountBalance(userName, accountNo string) (string, error) }
定义两种支付并调用两种支付方法:func main() { var payservice service.Pay payservice = NewPay1("http://127.0.0.1:8081") payservice.GetAccountBalance("aa", "bb") payservice = NewPay2("http://127.0.0.1:8082") payservice.GetAccountBalance("cc", "dd") } type Pay1 struct { Addr string } func NewPay1(addr string) *Pay1 { return &Pay1{Addr: addr} } func (p *Pay1) GetAccountBalance(userName, accountNo string) (string, error) { fmt.Println("支付1") fmt.Println(p.Addr) fmt.Println(userName) fmt.Println(accountNo) return "", nil } type Pay2 struct { Addr string } func NewPay2(addr string) *Pay2 { return &Pay2{Addr: addr} } func (p *Pay2) GetAccountBalance(userName, accountNo string) (string, error) { fmt.Println("支付2") fmt.Println(p.Addr) fmt.Println(userName) fmt.Println(accountNo) return "", nil }
输出结果: