接口定义

Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能 包含任何变量。

type Interface interface {
  test1(a, b int) bool
  test2()
}

interface类型默认是一个指针。

空接口(a interface{})可以被任何类型所实现,如动物可以被猫、狗、人等实现,反之人不一定能实现动物

func main() {
  var a interface{}   var b int
  a = b   fmt.Printf("%T\n", a)   var s string
  a = s   fmt.Printf("%T", a)
}

接口只是一种规范,并没有实现,不能直接调用

type testInterface int

func (t testInterface) test1(a, b int) bool {
return a < b
} func (t testInterface) test2() {
fmt.Println("test2")
} func main() {
var a Interface
a.test2()
}

接口实现

Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement 类似的关键字。

type testInterface int

func (t testInterface) test1(a, b int) bool {
  return a < b
} func (t testInterface) test2() {
  fmt.Println("test2")
} func main() {
  var a testInterface
  fmt.Printf("%T\n", a.test1(1, 2))
  a.test2()
}

接口实现时需要实现规范内的所有方法,否则会报错

type Interface interface {
test1(a, b int) bool
test2()
} type testInterface int func (t testInterface) test1(a, b int) bool {
return a < b
} func main() {
var test testInterface
var i Interface i = test fmt.Println(test) }

cannot use test (type testInterface) as type Interface in assignment:
testInterface does not implement Interface (missing test2 method)

如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个 接口。

type human interface { //人类
get_country() //国家
} type lang interface {
speek() //语言
} type chinesePeople struct { //中国人
country string
} func (c chinesePeople) get_country() {
fmt.Println(c.country)
} type japanese struct { //日本人
country string
} func (c japanese) get_country() {
fmt.Println(c.country)
} func (c japanese) speek() { //说的语言
fmt.Println("ハロー")
} func main() { var c = chinesePeople{
country: "china",
} var j = japanese{
country: "japan",
}
var h human
var langage lang h = c h.get_country() langage = j
h = j
h.get_country()
langage.speek()
}

japanese结构体实现了两个接口

chinese结构体实现了country接口如果使用lang赋值会提示未实现该接口

cannot use c (type chinesePeople) as type lang in assignment:
chinesePeople does not implement lang (missing speek method)

接口嵌套

一个接口可以嵌套在另外的接口

package main

type human interface {
run()
eyes()
} type info interface {
country()
sex()
} type chinesePeople interface {
human
info
} func main() { }

类型断言

接口是一般类型,不知道具体类型,如果要转成具体类型

语法

目标类型 := x.(t)
目标类型,布尔值 := x.(t)

两者区别为,安全类型与不安全类断言,非安全类型如果判定失败,这个操作会抛出panic

如:

var i interface{}
i = 10
j := i.(string)
fmt.Printf("%T\n", j)

断言的操作对象x是一个nil接口值,那么不论被断言的类型T是什么这个类型断言都会失败。

var i interface{}
i = nil
j := i.(nil)

安全类型的断言

t, ok := i.(int)
if ok == false {
  fmt.Printf("失败,断言的类型为%T,而i的类型为%T", t, i)
  os.Exit(1)
} fmt.Printf("成功%T", t)

  

golang interface的更多相关文章

  1. Golang Interface 解析

    转自 https://zhuanlan.zhihu.com/p/27652856 先看一段代码: 123456789101112 func (x interface{}) { if x == nil ...

  2. golang:interface{}类型测试

    在golang中空的interface即interface{}可以看作任意类型, 即C中的void *. 对interface{}进行类型测试有2种语法: 1. Comma-ok断言: value, ...

  3. 工作随笔——Golang interface 转换成其他类型

    新的公司,新的氛围.一年了,打算写点什么.so,那就写google的golang语言吧. 最最最基础的语法结构见go语言菜鸟教程 接下来写点菜鸟教程没有的. go语言的设计者认为:go语言必须让程序员 ...

  4. golang interface判断为空nil

    要判断interface 空的问题,首先看下其底层实现. interface 底层结构 根据 interface 是否包含有 method,底层实现上用两种 struct 来表示:iface 和 ef ...

  5. 浅析 golang interface 实现原理

    interface 在 golang 中是一个非常重要的特性.它相对于其它语言有很多优势: duck typing.大多数的静态语言需要显示的声明类型的继承关系.而 golang 通过 interfa ...

  6. golang interface 多态

    原文链接:http://www.52bd.net/code/210.html demo: package main import ( "fmt" ) //通知行为的接口 type ...

  7. golang interface 类型学习

    接口类型变量的内存结构 动态类型 动态值 对于动态类型指的是当其他非接口类型变量赋值给接口类型变量时,接口类型变量中的动态类型就是当前非接口类型 对于动态值指的就是当其他非接口类型变量赋值给接口类型变 ...

  8. golang interface类型转string等其他类型

    inter 是interface类型,转化为string类型是: str := inter .(string) 转为其他类型也类似

  9. golang interface 转 string,int,float64

    func interface2String(inter interface{}) { switch inter.(type) { case string: fmt.Println("stri ...

随机推荐

  1. 「POJ-3608」Bridge Across Islands (旋转卡壳--求两凸包距离)

    题目链接 POJ-3608 Bridge Across Islands 题意 依次按逆时针方向给出凸包,在两个凸包小岛之间造桥,求最小距离. 题解 旋转卡壳的应用之一:求两凸包的最近距离. 找到凸包 ...

  2. BZOJ 2728: [HNOI2012]与非(位运算)

    题意 定义 NAND(与非)运算,其运算结果为真当且仅当两个输入的布尔值不全为真,也就是 A NAND B = NOT(A AND B) ,运算位数不会超过 \(k\) 位, 给你 \(n\) 个整数 ...

  3. LOJ #2234. 「JLOI2014」聪明的燕姿(搜索 + 数论)

    题意 给出一个数 \(S\) ,输出所有约数和等于 \(S\) 的数. \(S \le 2 \times 10^9\) ,数据组数 \(\le 100\) . 题解 首先用约数和定理: \[ \beg ...

  4. 【HDU1848】Fibonacci again and again(博弈论)

    [HDU1848]Fibonacci again and again(博弈论) 题面 Hdu 你有三堆石子,每堆石子的个数是\(n,m,p\),你每次可以从一堆石子中取走斐波那契数列中一个元素等数量的 ...

  5. 「SCOI2016」围棋 解题报告

    「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...

  6. [CTSC2012]熟悉的文章(后缀自动机+动态规划)

    题目描述 阿米巴是小强的好朋友. 在小强眼中,阿米巴是一个作文成绩很高的文艺青年.为了获取考试作文的真谛,小强向阿米巴求教.阿米巴给小强展示了几篇作文,小强觉得这些文章怎么看怎么觉得熟悉,仿佛是某些范 ...

  7. 仓鼠找sugar(LCA)

    小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆( ...

  8. poj 3414 Pots(bfs+输出路径)

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  9. 时间复杂度和大O表示法

    大O表示法:称一个函数g(n)是O(f(n)),当且仅当存在常数c>0和n0>=1,对一切n>n0均有|g(n)|<=c|f(n)|成立,也称函数g(n)以f(n)为界或者称g ...

  10. js 获取随机数 Math.random()

    js 获取随机数 Math.random() // 结果为0-1间的一个随机数(包括0,不包括1) var randomNum1 = Math.random(); //console.log(rand ...