《Go语言核心编程》(二)

接口的数据结构

非空接口初始化的过程就是初始化一个iface类型的结构,示例如下:

//src/runtime/runtime2.go

type iface struct {
	tab *itab	//itab存放类型及方法指针信息
	data unsafe.Pointer 	//数据信息
}

type itab struct {
	inter *interfacetype	//接口自身的静态类型
	_type *_type			//_type就是接口存放的具体实例的类型(动态类型)
	//hash存放具体类型的Hash值
	hash unit32				//copy of _type.hash. Used for type switches.
	_    [4]byte
	fun  [1]unitptr			//variable sized. fun[0]==0 means _type does not implement inter.
}

可以看到iface结构很简单,有两个指针类型字段。

  • itab:用来存放接口自身类型和绑定的实例类型及实例相关的函数指针。
  • 函数指针data:指向接口绑定的实例副本,接口的初始化也是一种值拷贝。
接口调用代价

1、接口实例化的过程。
2、接口的方法调用,它是一个函数指针的间接调用。

并发

这一章先介绍了语言语法对并发编程的支持,然后介绍常用的并发编程范式,最后介绍context标准库和Go语言并发调度模型(单独开坑)。

goroutine有如下特性:
  • go的执行是非阻塞的,不会等待。
  • go后面的函数的返回值会被忽略。
  • 调度器不能保证多个goroutine的执行次序。
  • 没有父子goroutine的概念,所有的goroutine是平等地被调度和执行的。
  • Go程序在执行时会单独为main函数创建一个goroutine,遇到其他go关键字时再去创建其他的goroutine。
  • Go没有暴露goroutine id给用户,所以不能在一个goroutine里面显示地操作另一个goroutine,不过runtine包提供了一些函数访问和设置goroutine的相关信息。
并发范式
  • 生成器
  • 管道(调用链)
  • 每个请求一个goroutine
  • 固定worker工作池
  • future模式
context的设计目的

context库的设计目的就是跟踪goroutine调用树,并在这些goroutine调用树种传递通知和元数据,两个目的:
(1)退出通知机制——通知可以传递给整个goroutine调用树上的每一个goroutine。
(2)传递数据——数据可以传递给整个goroutine调用树上的每一个goroutine。(用来打印log)

反射

反射就是程序能够在运行时动态的查看自己的状态,并且允许修改自身的行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值