go 的接口类型用于定义一组行为,其中每个行为都由一个方法声明表示。

接口类型中的方法声明只有方法签名而没有方法实体,而方法签名包括且仅包括方法的名称、参数列表和结果列表。

只要一种数据类型的方法集合中包含了Talk接口声明中的所有方法,那么它就一定是Talk接口的实现类型。

type Talk interface{
Hello(username stirng)string
Talk(heard string)(saying string ,end bool, err error)
} type myTalk string
func (talk myTalk)Hello(username stirng)string{
//省略部分代码
} func (talk myTalk)Talk(heard string)(saying string ,end bool, err error){
//省略部分代码
}

上面示例中,与myTalk关联的所有方法都是指针方法,这意味着,myTalk类型并不是Talk接口的实现类型,*myTalk类型才是。

一个接口类型的变量可以被赋予任何实现类型的值

eg:

var talk Talk = new(myTalk)

 内建函数new的功能是创建一个指定类型的值,并返回指向该值的指针。

若想确定变量talk中值是否属于“myTalk” 类型,则可以用类型断言来判断:

_,ok :=talk.(*myTalk)

  

go的数据类型之间并不存在继承关系,接口类型也是如此,不过,一个接口型的声明中可以嵌套任意其他接口类型。

type Chatbot interfaxce{
Name()string
Regin()(string,error)
Talk
ReportError(err errors)string
End() error
}

  moke/moke.go

package moke

//interface definition
type VowelsFinder interface {
FindVowels() []rune
} type MyString string //MyString implements VowelsFinder
func (ms MyString) FindVowels() []rune {
var vowels []rune
for _, rune := range ms {
if rune == 'a' || rune == 'e' || rune == 'i' || rune == 'o' || rune == 'u' {
vowels = append(vowels, rune)
}
}
return vowels
}

  main.go

package main

import (
"fmt"
"studycode/moke"
) func main() {
name := moke.MyString("Sam Anderson")
var v moke.VowelsFinder
v = name // possible since MyString implements VowelsFinder
fmt.Printf("Vowels are %c", v.FindVowels()) }

  

执行结果

示例二:

man/man.go

package man

import (
"fmt"
) type People interface {
GetAge() int
GetName() string
} type Man struct {
} func (a *Man) GetAge() int {
return 18
} func (a *Man) GetName() string {
return "mike"
} func TestPeople(p interface{}) {
switch p.(type) { //变量.(type)只能在switch中使用
case People:
fmt.Println("realize People interface")
default:
fmt.Println("realize People2 interface")
} }

  main.go

package main

import (
"studycode/man"
) func main() {
man1 := man.Man{}
man.TestPeople(&man1) }

  执行结果

golang学习笔记--接口的更多相关文章

  1. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题

    golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...

  2. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  3. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  4. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

  5. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  6. golang学习笔记14 golang substring 截取字符串

    golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...

  7. golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换

    golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...

  8. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  9. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

随机推荐

  1. 红黑树实现(c/c++)

    红黑树 简介 一直想写的一种数据结构,非常厉害的思想,插入,删除,查找,修改,都是\(log_2 n\)的时间复杂度. 比AVL更强大的是,插入删除综合效率比AVL要优秀一点. 性质 一颗红黑树是满足 ...

  2. MySQL权限管理、配置文件(三)

    一.MySQL权限管理 GRANT 权限 ON 授权范围 TO '用户名'@'允许的ip(所有%)' IDENTIFIED BY '用户密码'; 权限:参加下表,一般常用的是CREATE.DELETE ...

  3. helm搭建本地chart仓库及基本操作

    这个步骤,是配合公司的竞赛. 因为公司这次的环境,我们只有namespace权限,而没有整个集群的管理, 而且,公司没有提供统一的helm chart repo, 所以只能自建. 参考URL: htt ...

  4. Python基础之输出格式和If判断

    格式化输出的三种方式 一.占位符 #占位符 name = 'nick' age = 19 print('my name is %s my age is %s' % (name, age)) age = ...

  5. CCF虚拟现实与可视化技术专委会丨面向增强现实的可视计算技术研究进展概述

    https://mp.weixin.qq.com/s/I-rNwgXHEtwgdpkWzKtVXw 摘要 新一代增强现实技术需要依赖可视计算理论与方法解决大尺度复杂环境下的场景建模.内容生成.感知交互 ...

  6. cc2530的第三次实验,按键中断控制流水灯

    cc2530的第三次实验:按键中断控制流水灯 效果为按一次按键,流水灯亮一次 实验相关电路图: 实验相关寄存器: 初始化函数 //初始化LED灯 //设置P1SEL,通用为0,外设为1 1111110 ...

  7. 使用plv8+ shortid npm包构建一个短唯一id服务

    plv8 是一个很强大的pg 扩展插件,我们可以直接额使用js 增强sql ,shortid 是一个用来生成短连接id 很方便的类库 因为shortid 是一个npm 模块,我们需要使用一种方法使用r ...

  8. CSS居中方案

    1.行内元素或者内联元素 1.垂直居中 设置行高和高度一致,如果没必要设置高度的话,可以直接利用line-height垂直性,直接设置需要的高度为line-height的高度亦可居中 .center- ...

  9. for循环的嵌套之打印倒三角的星星

    var str = ''; for(var i = 1; i<=10;i++) { for(var j = i; j<=10;j++) { str = str + '★' ; { str ...

  10. [Noip2018]填数游戏

    传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...