> 文章列表 > interface陷阱

interface陷阱

interface陷阱

A1

interface

Duck Typing: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子 目的: 在 Go 中,Interface(接口)只是一组方法集合。描述事物的外部行为而非内部结构。 通过接口实现多态的概念.

package mainimport "fmt"type Stringer interface {String() string
}// 接⼝嵌⼊
type Printer interface {StringerPrint()
}
type User struct {id   intname string
}func (self *User) String() string {return fmt.Sprintf("user %d, %s", self.id, self.name)
}
func (self *User) Print() {fmt.Println(self.String())
}func dump(t Printer) {t.String()t.Print()
}func main() {u := User{1, "Tom"}// 指针定义的方法只能传引用dump(&u)dump(u) // cannot use u (type User) as type Printer in argument to dump:
}

feature1:

  • 不再需要继承体系,继承树。
  • 实现类的时候,只关心其自身的方法,不用担心接口拆分的粒度。接口有使用方按需定义。减少事前规划。
  • 无需为了实现某一个接口,引入外部包或者依赖。使用方也无需担心是否有其他模块定义过类似接口。

feature2:

  1. 接口只有方法签名,没有实现。
  2. 接⼝没有数据字段。
  3. 可在接⼝中嵌入其他接口。
  4. 类型可实现多个接口。 

interface陷阱

接口描述,包括数据和类型 

陷阱: 通过接口修改数据

数据指针持有的是目标对象的只读复制品,复制完整对象或指针。要传引用才能真正修改 

陷阱:接口判nil

接⼝表存储元数据信息,包括接口类型、动态类型,以及实现接⼝的方法指针。

接口的类型和数据信息都为空时,接口才真正为nil