interface总结

值是否发生变化取决于是否是指针函数调用,不取决于调用变量(值或指针)

  1 package main
  2 
  3 import "fmt"
  4 
  5 type Integer int
  6 
  7 type IOperator interface {
  8     Add(Integer)
  9 }
 10 
 11 func (i Integer) Add(val Integer) {
 12     //func (i *Integer) Add(val Integer) {
 13     i += val
 14 }
 15 
 16 func main() {
 17     var val Integer = 2
 18     var val1 IOperator = &val
 19     var val2 IOperator = val //接口赋值,含有指针函数调用,只能传递指针,都是非指针函数调用可以传值和指针
 20 
 21     val.Add(Integer(4))
 22     fmt.Println(val)
 23 
 24     val1.Add(Integer(4))
 25     fmt.Println(val)
 26 
 27     val2.Add(Integer(4))
 28     fmt.Println(val)
 29 }

如果接口既有,指针函数调用,非指针函数调用

注意,sub方法没有值改变

  5 type Integer int
  6 
  7 type IOperator interface {
  8     Add(Integer)
  9     Sub(Integer)
 10 }
 11 
 12 func (i Integer) Sub(val Integer) {
 13     i -= val
 14 }
 15 
 16 func (i *Integer) Add(val Integer) {
 17     //func (i *Integer) Add(val Integer) {
 18     *i += val
 19 }
 20 
 21 func main() {
 22     var val Integer = 2
 23     var val1 IOperator = &val
 24     //var val2 IOperator = val //接口赋值,含有指针函数调用,只能传递指针,都是非指针函数调用可以传值和指针
 25 
 26     val.Add(Integer(4))
 27     fmt.Println(val)
 28 
 29     val1.Add(Integer(4))
 30     fmt.Println(val)
 31 
 32     val1.Sub(Integer(4))
 33     fmt.Println(val)
 34 
 35     //val2.Add(Integer(4))
 36     //fmt.Println(val)
 37 }

注意名字冲突问题

成员变量名字冲突,会暴露最外层,隐藏内部的

  5 type Logger struct {
  6     level int
  7 }
  8 
  9 //匿名组合类型相当于以其类型名称(去掉包名部分)
 10 //所以会编译错误
 11 type Log struct {
 12     Logger
 13     log.Logger
 14     level int
 15 }

接口基本使用和嵌套使用

接口赋值,要明确子集关系

扫描二维码关注公众号,回复: 3529785 查看本文章

接口赋值并不要求两个接口必须等价。如果接口A的方法列表是接口B的方法列表的子集,
那么接口B可以赋值给接口A

  3 type IReader interface {
  4     Read(buf []byte) (int, error)
  5 }
  6 
  7 type IWriter interface {
  8     Write(buf []byte) (int, error)
  9 }
 10 
 11 type IFile interface {
 12     Close() error
 13     IReader
 14     IWriter
 15 }
 16 
 17 type File struct {
 18 }
 19 
 20 func (f File) Read(buf []byte) (n int, err error) {
 21     return
 22 }
 23 
 24 func main() {
 25     //var file1 IFile = File{}  error
 26     var file2 IReader = new(File)
 27     file2.Read([]byte{})
 28     //var file3 IWriter = new(File) error
 29 
 30 }

猜你喜欢

转载自blog.csdn.net/nawenqiang/article/details/82901814
今日推荐