Go入门(六)-interface与反射机制

来源:互联网 发布:软件系统体系结构设计 编辑:程序博客网 时间:2024/06/08 05:22
interface
interface定义了一系列对象的行为,是一系列方法的组合。
8.1 与java类似,指定义方法,不能实现方法;
8.2 与java不同,Go的interface只能定义方法,不能定义变量;
8.3 与java不同,java的实现类通过关键字 implement 实现该interface的方法,Go并不需要特别声明,只要你实现了这个接口定义的方法,就是实现了该interface;如下例子,human实现了Behavior的接口,又因为human是teacher和student的匿名字段,所以teacher和student都实现了该接口,professor则重载了sing();
//定义一个interface类型,人类行为,有两个方法
type Behavior interface {
    sing()
    walk()
}
//定义人类属性
type human struct {
    name string
    age  int
}
// teacher属性
type teacher struct {
    human
    salary string
}
// student属性
type student struct {
    human
    school string
}
//human实现了sing方法
func (h human) sing() {
    fmt.Printf("my name is %s,I am singing\n", h.name)
}
//human实现了walk方法
func (h human) walk() {
    fmt.Printf("my name is %s,I am walking\n", h.name)
}
//professor属性
type professor struct {
    human
    bachelor string
}
//professor重载sing方法
func (p professor) sing() {
    fmt.Printf("my name is %s,I don't want to sing\n", p.name)
}
func main() {
    Jim := teacher{human{"Jim", 28}, "20000"}
    Lily := student{human{"Lily", 20}, "江南中学"}
    Han := professor{human{"Han", 35}, "PHD"}
    var proxy Behavior
    proxy = Jim
    proxy.sing()
    proxy = Lily
    proxy.sing()
    proxy = Han
    proxy.sing()
}
输出结果如下:
my name is Jim,I am singing
my name is Lily,I am singing
my name is Han,I don't want to sing
8.4 空interface
8.4.1 空interface不包含任何方法,根据上面的定义,任何类型都实现了该接口!也就是说,定义一个空的interface,它可以指向任何变量,酷不酷?想不想学?

8.4.2 interface的类型检查
    如果我们想知道这个接口到底是什么类型,怎么办?目前有两个方法:
8.4.2.1 使用断言语法:value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型;

8.4.2.2 使用element.(type)的方式,这个方法只能在switch下使用;


8.4.2.3 嵌入interface
和struct的匿名字段相似,A struct嵌入了B struct,A就拥有了B的全部属性,同理,A interface嵌入了B interface,A也拥有了B的method;

8.5 反射
反射就是能检查程序在运行时的状态。Go关于反射的方法存放在reflect包,在使用时需要导入。
8.5.1 reflect.ValueOf(h),得到实际的值,并且可以改变其字段值;
8.5.2 reflect.TypeOf(h),得到类型的元数据,通过t我们能获取类型定义里面的所有元素;
8.5.3 如果需修改value,该struct类型的字段必须是大写,前面我们说过,小写相当于private,是不能通过反射修改的,会报异常:
panic: reflect: reflect.Value.SetString using value obtained using unexported field
详细的使用方式,请看下面的例子:

输出结果:
valueOf: {Lucy 22}
type: main.human
kind is human: struct
elem: {Lucy 22}
tag: string
tag: int

原创粉丝点击