【1个月读懂filebeat源码】第14天
2021-03-28 12:59:57 By

好奇,Go 系统包是怎么实现,想起来以前没看完的书,名字叫:《UNIX环境高级编程》,号称 APUE,是不是有 Go 版本的,有意思,可以自己实现

8.17 反引号括起来是什么意思,而且 flag.Var 的第一个参数应该是取地址的引用,这个 newSliceValue 是返回的是一个 sliceValue 指针,有啥意义,类型相同换个名字,最终只为了放在 languages 变量里,那为什么不直接 flag.Var(&languages, "slice"...) 因为类型么

//定义一个类型,用于增加该类型方法
type sliceValue []string

//new一个存放命令行参数值的slice
func newSliceValue(vals []string, p *[]string) *sliceValue {
    *p = vals
    return (*sliceValue)(p)
}

...省略

func main(){
    var languages []string
    flag.Var(newSliceValue([]string{}, &languages), "slice", "I like programming `languages`")
    flag.Parse()
    //打印结果slice接收到的值
    fmt.Println(languages)
}
  • 9.1 并行和并发,引用原文

多线程程序在单核心的 cpu 上运行,称为并发;多线程程序在多核心的 cpu 上运行,称为并行。

并发与并行并不相同,并发主要由切换时间片来实现“同时”运行,并行则是直接利用多核实现多线程的运行,Go程序可以设置使用核心数,以发挥多核计算机的能力。

  • 9.1 go 协程在多核心下,可能发生并行,底层怎么共用栈的呢
  • 9.2 Go 的运行时,跟 C 类似,主要是提供 Go 程序在运行时的基础函数库。这个函数库是怎么实现的呢,这有助于每个程序语言学习者对 runtime 的深入理解。一下引用一下外部资料:

runtime 运行时 什么是 runtime 在计算机领域中,经常会接触到 runtime 这个概念,那么 runtime 究竟是什么东西?

runtime 描述了程序运行时候执行的软件/指令, 在每种语言有着不同的实现。可大可小,在 C 中,runtime 是库代码, 等同于 C runtime library,一系列 C 程序运行所需的函数,在 Java 中,runtime 还提供了 Java 程序运行所需的虚拟机等。

总而言之,runtime 是一个通用抽象的术语,指的是计算机程序运行的时候所需要的一切代码库,框架,平台等。

Go中的 runtime 在 Go 中, 有一个 runtime 库,其实现了垃圾回收,并发控制, 栈管理以及其他一些 Go 语言的关键特性。 runtime 库是每个 Go 程序的一部分,也就是说编译 Go 代码为机器代码时也会将其也编译进来。所以 Go 官方将其定位偏向类似于 C 语言中的库。Go 中的 runtime 不像 Java runtime (JRE, java runtime envirement ) 一样,jre 还会提供虚拟机, Java 程序要在 JRE 下 才能运行。

所以在 Go 语言中, runtime 只是提供支持语言特性的库的名称,也就是 Go 程序执行时候使用的库。

ref

  • 9.7 goroutine 和 coroutine 是不同的,前者可能多线程中并行,后者只能单线程中并发,参考:https://www.zhihu.com/question/334188547/answer/776106949
  • 9.10 判断 channel 是否关闭跟 9.8 中介绍非阻塞从 channel 拿数据一样?那怎么又能用来判断 channel 是否关闭呢。至少两个值能同时判断?这里明显就是 9.8 讲非阻塞用法没讲清楚,不是说使用多值接收就是非阻塞,而是非阻塞(比如结合 select)下,可以用多值判断,两码事
// 这个用法与 map 中的按键获取 value 的过程比较类似,只需要看第二个 bool 返回值即可,如果返回值是 false 则表示 ch 已经被关闭。
x, ok := <-ch
  • 9.11 无缓冲通道跟 9.8 普通通道啥区别,无缓冲的通道必须在发送和接收都同步完成了,才算是完成一次消息同步,否则发送或接收任何一方都会被阻塞
  • 第9章阅读完


© 2016-2021 taluo.ren 版权所有 ICP证:蜀ICP备15023822号-2