go语言之进阶篇接口的定义和实现以及接口的继承
1、接口的定义和实现以及接口的继承
示例:
package main import "fmt" //定义接口类型
type Humaner interface {
//方法,只有声明,没有实现,由别的类型(自定义类型)实现
sayhi()
} type Student struct {
name string
id int
} //Student实现了此方法
func (tmp *Student) sayhi() {
fmt.Printf("Student[%s, %d] sayhi\n", tmp.name, tmp.id)
} type Teacher struct {
addr string
group string
} //Teacher实现了此方法
func (tmp *Teacher) sayhi() {
fmt.Printf("Teacher[%s, %s] sayhi\n", tmp.addr, tmp.group)
} type MyStr string //MyStr实现了此方法
func (tmp *MyStr) sayhi() {
fmt.Printf("MyStr[%s] sayhi\n", *tmp)
} //定义一个普通函数,函数的参数为接口类型
//只有一个函数,可以有不同表现,多态
func WhoSayHi(i Humaner) {
i.sayhi()
} func main() {
s := &Student{"mike", 666}
t := &Teacher{"bj", "go"}
var str MyStr = "hello mike" //调用同一函数,不同表现,多态,多种形态
WhoSayHi(s)
WhoSayHi(t)
WhoSayHi(&str) //创建一个切片
x := make([]Humaner, 3)
x[0] = s
x[1] = t
x[2] = &str //第一个返回下标,第二个返回下标所对应的值
for _, i := range x {
i.sayhi()
} } func main01() {
//定义接口类型的变量
var i Humaner //只是实现了此接口方法的类型,那么这个类型的变量(接收者类型)就可以给i赋值
s := &Student{"mike", 666}
i = s
i.sayhi() t := &Teacher{"bj", "go"}
i = t
i.sayhi() var str MyStr = "hello mike"
i = &str
i.sayhi() }
#执行结果:
Student[mike, 666] sayhi
Teacher[bj, go] sayhi
MyStr[hello mike] sayhi Student[mike, 666] sayhi
Teacher[bj, go] sayhi
MyStr[hello mike] sayhi
go语言之进阶篇接口的定义和实现以及接口的继承的更多相关文章
- go语言之进阶篇接口转换
1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Pers ...
- go语言之进阶篇接口的继承
1.接口的继承 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Persone ...
- go语言之进阶篇文件常用操作接口介绍和使用
一.文件常用操作接口介绍 1.创建文件 法1: 推荐用法 func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对 ...
- go语言之进阶篇error接口应用
1.error接口应用 示例: package main import "fmt" import "errors" func MyDiv(a, b int) ( ...
- go语言之进阶篇error接口的使用
1.error接口的使用 示例: package main import "fmt" import "errors" func main() { //var e ...
- go语言之进阶篇空接口
1.空接口 示例: package main import "fmt" func xxx(arg ...interface{}) { } func main() { //空接口万能 ...
- go语言之进阶篇面向对象编程
1.面向对象编程 对于面向对象编程的支持Go 语言设计得非常简洁而优雅.因为, Go语言并没有沿袭传统面向对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继 ...
- Go语言之进阶篇连接mysql
一.Go连接mysql 1.mysql驱动 地址:https://github.com/Go-SQL-Driver/MySQL 说明: sql.Open()函数用来打开一个注册过的数据库驱动,Go-M ...
- Go语言之进阶篇爬捧腹网
1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html 下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页 ...
随机推荐
- 使用Runnable接口创建线程
实现Runnable接口的类必须使用Thread类的实例才能创建线程.通过Runnable接口创建线程分为两步: 1.将实现Runnable接口的类实例化. 2.建立一个Thread对象,并将第一步实 ...
- Java变量的默认值和初始化
Java变量的默认值和初始化 学习自 <Thinking In Java> 技术小黑屋-为什么局部变量需要显式设置初始化值 变量的默认值 注意只有成员变量才有默认值,而局部变量必须要赋初值 ...
- web前端实现本地存储
当我们在提及web前端本地存储的时候,首先需要介绍一下本地化存储的概念和历史.本地化存储从来不是一个新奇的概念,因为web应用程序一直在追求的就是媲美甚至超越桌面应用程序.但是桌面应用程序一直优于we ...
- POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- [CF580E]Kefa and Watch
题目大意: 维护一个由'0'~'9'构成的字符串,支持以下两种操作: 1.将指定区间内的所有字符修改为同一指定字符. 2.询问$x$是否为指定区间内的循环节. 思路: 建立一棵线段树,维护每个子串的哈 ...
- poj 1797 最短路变形dijkstra
题意:题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 链接:点我 解题思路:其实这个求最大边可以近似于 ...
- 【Codechef-Hard】Chef and Churu 分块
题目链接: https://www.codechef.com/problems/FNCS Solution 大力分块.. 对序列分块,维护块内前缀和.块的前缀和,修改时暴力维护两个前缀和,询问单点答案 ...
- Xtreme8.0 - Kabloom dp
Xtreme8.0 - Kabloom 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/kablo ...
- oracle定时任务的编写及查看删除
declare jobno number; begin dbms_job.submit( jobno,--定时器ID,系统自动获得 'PRC_INSERT;', --what执行的过程名 sysdat ...
- [廖雪峰] Git 分支管理(3):分支管理策略
通常,合并分支时,如果可能,Git 会用 Fast forward 模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制 禁用 Fast forward 模式,Git 就会在 merge 时生 ...