Golang接口

接口定义

type 接口名  interface {
	方法1 (参数列表1) 返回值1
}

//接口是一个规范
type Usber interface {
	start()
	stop()
}

//如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口

type Phone struct {
	Name string
}

//手机要实现usb接口的话必须得实现usb接口中的所有方法
func (p Phone) start() {
	fmt.Println(p.Name, "启动")
}

func (p Phone) stop() {
	fmt.Println(p.Name, "关机")
}

type Camera struct {
}

func (p Camera) start() {
	fmt.Println("相机启动")
}

func (p Camera) stop() {
	fmt.Println("相机关机")
}

func (p Camera) run() {
	fmt.Println("run")
}

func main() {

	p := Phone{
		Name: "华为手机",
	}
	// p.start1()

	var p1 Usber //golang中接口就是一个数据类型
	p1 = p       //表示手机实现Usb接口
	p1.stop()

	c := Camera{}
	var c1 Usber = c //表示相机实现了Usb接口
	c1.start()
	// c1.run()  //错误:type Usber has no field or method run)
	c.run() //run
}
type Usber interface {
	start()
	stop()
}

//电脑
type Computer struct {
}

// var usb Usber =camera

func (c Computer) work(usb Usber) {
	usb.start()
	usb.stop()
}

//手机
type Phone struct {
	Name string
}

func (p Phone) start() {
	fmt.Println(p.Name, "启动")
}

func (p Phone) stop() {
	fmt.Println(p.Name, "关机")
}

//照相机
type Camera struct {
}

func (p Camera) start() {
	fmt.Println("相机启动")
}
func (p Camera) stop() {
	fmt.Println("相机关机")
}

func main() {

	var computer = Computer{}
	var phone = Phone{
		Name: "小米",
	}
	var camera = Camera{}

	computer.work(phone)

	computer.work(camera)

}

空接口

type  A interface {} //空接口
golang中空接口可以当做任意类型来使用
var a A
var str = "xxxxx"
a = str
var num = 20
a = num    //任何数据类型都能实现空接口


//空接口map
var m = make(map[string]interface{})
m["username"] = "zs"
m["age"] = 20

//空接口切片
var s = []interface{}{1,2 ,"ss",true}

断言

x.[T]
x 表示interface变量
T  表示x的类型

var  a = interface{}
a ="xxxx"
x.(string) 
x.(int)

结构体接口 值接受者和指针接受者

指针接收者: 如果结构体中的方法是指针接收者,那么实例化后结构体指针类型都可以赋值给接口变量, 结构体值类型没法赋值给接口变量
type Usber interface {
	start()
	stop()
}
type Phone struct {
	Name string
}

func (p *Phone) start() {
	fmt.Println(p.Name, "启动")
}
func (p *Phone) stop() {
	fmt.Println(p.Name, "关机")
}
p := &Phone{
	Name: "xiaomi",
}
var p1 Usber
p1 = p
p1.start()
值接收者: 如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
type Usber interface {
	start()
	stop()
}

type Phone struct {
	Name string
}

func (p Phone) start() {
	fmt.Println(p.Name, "启动")
}
func (p Phone) stop() {
	fmt.Println(p.Name, "关机")
}
p := Phone{
	Name: "xiaomi",
}
var p1 Usber
p1 = p
p1.start()
var p2 = &Phone{
	Name: "huawei",
}
p1 = p2
p1.start()

结构体嵌套

type A interface {}
type B interface {}
type C interface {
	A
	B
}

空接口和断言结合

type Address struct {
    Name string
    Phone int
}

var userinfo = make(map[string]interface{})
userinfo["name"] = "zs"
userinfo["age"] = 18
userinfo["hobby"] = []string{"吃饭","睡觉","打豆豆"}

//想获取hobby下面的第一个元素  userinfo["hobby"][1]这种会获取错误,要借助断言获取
h,ok := userinfo["hobby"].([]string)
if ok:
	fmt.Println(h[0])
var address = Address{
    Name: "ls",
    Phone: 13333333333,
}
userinfo["address"] = address
//错误获取  userinfo["address"].Name
a,ok := userinfo["address"].(Address)
if ok:
	fmt.Println(a.Name)

Golang接口
http://www.jcwit.com/article/5/
作者
Carlos
发布于
2024年3月8日
许可协议