type Pet interface {
SetName(name string)
Name() string
Category() string
}
// 只要一个数据类型的方法集合中有上述3个方法,那它就是Pet接口的实现类型
// 这是一种无侵入式的接口实现方式
// 动态值是赋给接口类型变量的值
// 动态类型是被赋予给接口类型变量的值的类型
dog := Dog{"little pig"}
var pet Pet = &dog
// &dog是动态值,*dog是动态类型
// pet的类型是静态类型
var dog1 *Dog // 声明*Dog类型的变dog1,没有初始化,dog1的值为nil
fmt.Println("The first dog is nil. ")
dog2 := dog1 // dog2的值也为nil
fmt.Println("The second dog is nil. ")
var pet Pet = dog2 // pet的动态值不为nil,pet的动态类型为*Dog
if pet == nil {
fmt.Println("The pet is nil. ")
} else {
fmt.Println("The pet is not nil. ")
}
// dog2的值是真正的nil,把dog2赋值给pet时,Go语言把值和类型放在一起考虑
// 因此pet的动态值不是nil
// Go语言识别出赋予pet的值是一个*Dog类型的nil值
// Go语言用iface的实例包装它,包装后pet的值肯定不是nil
type Animal interface {
ScientificName() string
Category() string
}
type Pet interface {
Animal // 嵌入
Name() string
}
// Animal接口包含的所有方法成为了Pet接口的方法
// 库源码文件
package widget
type Widget struct {
id string
}
func (w Widget) ID() string {
return w.id
}
// 命令源码文件
package main
import (
"fmt"
"github.com/Promacanthus/vigour/widget"
)
func main() {
w := widget.Widget{}
fmt.Println(w.ID())
}
// output
// 空字符串
// 库源码文件
package widget
import "github.com/google/uuid"
type Widget struct {
id string
}
func NewWidget() Widget {
return Widget{id: uuid.New().String()}
}
func (w Widget) ID() string {
return w.id
}
// 命令源码文件
package main
import (
"fmt"
"github.com/Promacanthus/vigour/widget"
)
func main() {
w := widget.NewWidget()
fmt.Println(w.ID())
}
// output
6608a452-ed5f-4473-84dc-b4f3e77c470d