go学习-interface

初始化

package main

import (
    "fmt"
)

type Animal interface {
    Speak() string
}

type Dog struct {
}

func (d Dog) Speak() string {
    return "Woof!"
}

func main() {
    var a Animal
    a = Dog{}
    fmt.Println(a.Speak())
}

1、类型判断与type switch

package main

import (
	"fmt"
)

type Animal interface {
	Speak() string
}

type Dog struct {
	name string
}

func (d Dog) Speak() string {
	return "i am dog"
}

func (d Dog) Run() string {
	return "dog running"
}

type Cat struct {
	name string
}

func (c Cat) Speak() string {
	return "i am cat"
}

func main() {
	d := Dog{}
	dogRun(d)

	c := Cat{}

	animalSpeak(d)
	animalSpeak(c)
}

func animalSpeak(a Animal) {
	switch a.(type) {
	case Dog:
		fmt.Println(a.Speak())
	case Cat:
		fmt.Println(a.Speak())
	default:
		fmt.Println("unknow")
	}
}

func dogRun(a Animal) {
	if v, ok := a.(Dog); ok {
		fmt.Println(v.Run())
		return
	}
	fmt.Println("i am not dog")
}

2、数据类型强制转换,只是发生拷贝不是引用

package main

import (
	"fmt"
)

type USB interface {
	Name() string
	Connector
}

type Connector interface {
	connect()
}

type phone struct {
	name string
}

func (p phone) Name() string {
	return p.name
}

func (p phone) connect() {
	fmt.Println("connect", p.name)
}

func main() {
	a := phone{"iphone"}
	a.connect()

	var v USB
	v = USB(a)
	v.connect()

	a.name = "cll"
	a.connect()
	v.connect()
}

3、interface{}做为参数可以接受任意类型

package main

import (
	"fmt"
)

type Animal interface {
	Speak() string
}

type Dog struct {
	name string
}

func (d Dog) Speak() string {
	return "i am dog"
}

func (d Dog) Run() string {
	return "dog running"
}

func main() {
	d := Dog{}
	myprint(d)
	myprint("hello world")
	myprint([2]int{1, 2})
	myprint(nil)
	myprint(new(Dog))
	myprint(make([]int, 2, 10))
}

func myprint(v interface{}) {
	fmt.Println(v)
}

4、interface内存包括两个值,一个类型,一个值

5、指针,类型作为receiver的区别

func (c *Cat) Speak() string {
    return "Meow!"
}
func (c Cat) Speak() string {
    return "Meow!"
}

第一种情况只能被new(Cat)转换,不能被Cat{}转换

第二种能被new(Cat),也能被cat{}转换

参考:http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go

6、指针receiver 和 值receiver 的应用区别

Error Handling In Go, Part I

Error Handling In Go, Part II

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值