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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章