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是断言的类型;
和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
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
阅读全文
0 0
- Go入门(六)-interface与反射机制
- go的反射机制和interface
- go语言快速入门:go的反射机制(22)
- GO语言反射机制
- go-反射机制
- 一. Go入门-初探interface类型
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
- JAVA反射机制入门
- Java反射机制入门
- Go --- InterFace
- go-interface
- Go-Interface
- Go Interface
- 类加载机制与反射(一)
- 类加载机制与反射(二)
- 反射机制与内省
- 0012 Java反射机制【入门】
- java反射机制----初步入门
- HTML学习之路01--设置背景
- nginx安装——centos
- 324. Wiggle Sort II
- python
- spring和mybatis集成出现的问题
- Go入门(六)-interface与反射机制
- xsd是什么
- 第1周第2节课 算法及其描述、算法分析基础
- iOS XCode中upload报错:Error ITMS-4238 “Redundant Binary Upload”
- [MyBatis]DAO层只写接口,不用写实现类
- token和session其实并无本质区别
- 在有HttpServletRequest下,获取当前项目的webapp路径
- CPU,内存等大概对应人体部位
- 我的《自学编程》之路