golang之interface(接口)与 reflect 机制
一、概述
什么是interface,简单的说,interface是一组method的组合,通过interface来定义对象的一组行为;
interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口;
package main
import "fmt"
type Human struct {
name string
age int
phone string
}
type Student struct {
Human //匿名函数
school string
loan float32
}
type Employee struct {
Human
company string
money float32
}
//Human对象实现Sayhi方法
func (h *Human) Sayhi() {
fmt.Printf("hi, I am %s you can call me on %s\n", h.name, h.phone)
}
//Human对象实现了Sing方法
func (h *Human) Sing(lyrics string) {
fmt.Println("lalala...", lyrics)
}
//Human对象实现了Guzzle方法
func (h *Human) Guzzle(beerStein string) {
fmt.Println("Guzzle Guzzle...", beerStein)
}
//Student 实现了BorrowMoney方法
func (s *Student) BorrowMoney(amount float32) {
s.loan += amount
}
//Empolyee 重载了Human的Sayhi的方法
func (e *Employee) Sayhi() {
fmt.Printf("hi, I am %s, I work at %s. call me on %s\n", e.name, e.company, e.phone)
}
//Employee实现了SpendSalary的方法
func (e *Employee) SpendSalary(amount float32) {
e.money -= amount
}
//define interface
/*
type Men interface {
Sayhi()
Sing(lyrics string)
Guzzle(beerStein string)
}
type YoungChap interface {
Sayhi()
Sing(song string)
BorrowMoney(amount float32)
}
type ElderlyGent interface {
Sayhi()
Sing(song string)
SpendSalary(amount float32)
}
*/
//interface Men被Human,Student, Employee都实现
// Student, Employee包含了Human匿名字段,所有也包含了其接口实现
type Men interface {
Sayhi()
Sing(lyrics string)
}
func main() {
mike := Student{Human{"Mike", , "22-22-xx"}, "MIT", 0.00}
paul := Student{Human{"paul", , "23-32-xx"}, "Harvard", 5.00}
sam := Employee{Human{"Sam", , "33-33-33"}, "Gling inc", }
Tom := Employee{Human{"Tom", , "33-334-11"}, "Things ltd", }
var i Men //interface type
i = &mike
fmt.Println("this is Mike, a Student\n")
i.Sayhi()
i.Sing("my name is Mike")
i = &Tom
fmt.Println("this is Tom, an employee\n")
i.Sayhi()
i.Sing("my name is Tom")
x := make([]Men, )
x[], x[], x[] = &paul, &sam, &mike
for _, value := range x {
value.Sayhi()
}
}
二、反射机制
package main import (
"fmt"
"reflect"
) func main() {
var x float64 = 3.4
p := reflect.ValueOf(&x)
v := p.Elem()
fmt.Println(v)
v.SetFloat(8.3)
fmt.Println(v)
}
golang之interface(接口)与 reflect 机制的更多相关文章
- Golang 之 interface接口全面理解
什么是interface 在面向对象编程中,可以这么说:“接口定义了对象的行为”, 那么具体的实现行为就取决于对象了. 在Go中,接口是一组方法签名(声明的是一组方法的集合).当一个类型为接口中的所有 ...
- golang基础--Interface接口
接口是一个或多个方法签名名的集合,定义方式如下 type Interface_Name interface { method_a() string method_b() int .... } 只要某个 ...
- golang面向对象和interface接口
一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...
- JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac
记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...
- go语言之行--接口(interface)、反射(reflect)详解
一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: ...
- Golang 入门系列(四)如何理解interface接口
前面讲了很多Go 语言的基础知识,包括go环境的安装,go语言的语法等,感兴趣的朋友,可以先看看之前的文章.https://www.cnblogs.com/zhangweizhong/category ...
- Golang基础(8):go interface接口
一:接口概要 接口是一种重要的类型,他是一组确定的方法集合. 一个接口变量可以存储任何实现了接口方法的具体值.一个重要的例子就是io.Reader和io.Writer type Reader inte ...
- golang的interface剖析
背景: golang的interface是一种satisfied式的.A类只要实现了IA interface定义的方法,A就satisfied了接口IA.更抽象一层,如果某些设计上需要一些更抽象的 ...
- Golang的Interface是个什么鬼
问题概述 Golang的interface,和别的语言是不同的.它不需要显式的implements,只要某个struct实现了interface里的所有函数,编译器会自动认为它实现了这个interfa ...
- interface接口
当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口 interface. 定义接口使用的关键字不是class,是interface.接口中常见的成员: 这些成员都有 ...
随机推荐
- zk 节点故障 重连机制
<pre name="code" class="html">如果在连接时候zk服务器宕机 To create a client session th ...
- GDB单步调试程序
linux下gdb单步调试 用 GDB 调试程序 GDB 概述———— GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像 VC. BCB等 ...
- TED Talk-教育如何扼杀创造力
TED上面有个"11个必须看的TED演讲"的播放列表,"教育扼杀创新"是其中一个.下面贴的是演讲的中文翻译. 早上好. 前面的演讲都很好,对不对? 我已经完全被 ...
- PHP自定义函数与字符串处理
自定义函数: 1.默认值的函数: function Main($a=5,$b=6) { echo $a*$b; } 2.可变参数的函数: function ...
- 如何同时激活两个不同版本的MyEclipse 【MyEclipse2013和MyEclipse2014同时激活】
激活一个MyEclipse的步骤,大家都会,在这里就不多说了,不会的可以看:http://jingyan.baidu.com/article/3ea51489cc14d452e71bba7a.html ...
- Struts2 对Action中所有方法进行输入校验、单个方法进行校验
index.jsp: <body> <s:fielderror /> <form action="${pageContext.request.contextPa ...
- Log4Net不生成日志文件
可能没有初始化配置,在Global文件Application_Start添加 log4net.Config.XmlConfigurator.Configure(); 或者输出日志进行初始化,如(Log ...
- PHPExcel Fatal error: ZipArchive library is not enabled
导致上述问题的可能性有两种: 1.没开启php_zip.dll扩展 a.在Windows下的解决办法是: (a1) 在php.ini文件中,将extension=php_zip.dll前面的分号“; ...
- javaEE servlet获取jsp内置对象
既然jsp和servlet是等价的,在jsp中能够使用内置对象,那么在servlet中也能够使用. 1.获得out对象 能够使用例如以下代码获得out对象: import java.io.PrintW ...
- Django学习笔记(一)
之前没有接触过django,甚至python也是最近才刚刚着手学习,可以说是零基础.要学习一门新技术,官方文档自然是首选的入门教程.开发环境:python2.7+django1.7+win 1.首先, ...