在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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下使用; 和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 |
请发表评论