400-700-1307

【GO+区块链面试题】interface内部结构

2019-01-29 14:32

以下代码打印出来什么内容,说出为什么。

 

package main

import (

"fmt"

)

type People interface {

Show()

}

type Student struct{}

func (stu *Student) Show() {

}

func live() People {

var stu *Student

return stu

}

func main() {

if live() == nil {

fmt.Println("AAAAAAA")

} else {

fmt.Println("BBBBBBB")

}

}

考点:interface内部结构

解答:

很经典的题! 这个考点是很多人忽略的interface内部结构。 go中的接口分为两种一种是空的接口类似这样:

var in interface{}

另一种如题目:

 

type People interface {

Show()

}

他们的底层结构如下:

 

type eface struct {      //空接口

_type *_type         //类型信息

data  unsafe.Pointer //指向数据的指针(go语言中特殊的指针类型unsafe.Pointer类似于c语言中的void*)

}

type iface struct {      //带有方法的接口

tab  *itab           //存储type信息还有结构实现方法的集合

data unsafe.Pointer  //指向数据的指针(go语言中特殊的指针类型unsafe.Pointer类似于c语言中的void*)

}

type _type struct {

size       uintptr  //类型大小

ptrdata    uintptr  //前缀持有所有指针的内存大小

hash       uint32   //数据hash

tflag      tflag

align      uint8    //对齐

fieldalign uint8    //嵌入结构体时的对齐

kind       uint8    //kind 有些枚举值kind等于0是无效的

alg        *typeAlg //函数指针数组,类型实现的所有方法

gcdata    *byte

str       nameOff

ptrToThis typeOff

}

type itab struct {

inter  *interfacetype  //接口类型

_type  *_type          //结构类型

link   *itab

bad    int32

inhash int32

fun    [1]uintptr      //可变大小 方法集合

}

可以看出ifaceeface 中间多了一层itab结构。 itab 存储_type信息和[]fun方法集,从上面的结构我们就可得出,因为data指向了nil 并不代表interface nil, 所以返回值并不为空,这里的fun(方法集)定义了接口的接收规则,在编译的过程中需要验证是否实现接口 结果:

BBBBBBB


上一篇:【GO+区块链面试题】golang的方法集
下一篇:没有了

开班信息

当前校区

北京校区
  • 北京校区
  • 上海校区
  • 广州校区
  • 沈阳校区
  • 杭州校区
  • 南京校区
  • 郑州校区
  • 成都校区
  • 深圳校区
  • 西安校区
  • 苏州校区
  • 深圳沙井
  • 深圳观澜
  • 深圳龙岗
  • 武汉校区
  • 西宁校区
  • 石家庄校区
  • 湖北咸宁
  • 广东惠州
  • 广东佛山

                    Copyright © 2007-2019 IT兄弟连教育 版权所有 京ICP备11018177号  京公网安备 11010802026987号