因为是随手记,所以内容是断断续续的(也是个人发文章习惯,造成视觉不适,请谅解),但是都是个人认为的主要知识点。
GO发展三位创始人:Ken Thompson、Robert Griesemer、Rob Pike。
诞生时间:2007年开始设计,2009年趋于稳定。
设计起因:在google时,当时大量对c++11吹捧,特性还复杂,三位大神看不下去了,所以...,目标是设计网络时代和多核时代的C语言。
GO的另一种描述:"类C语言"、"21世纪C语言"。
特性起源:(1)并发思想:从CSP理论演化。->squeak->newsqueak(1989年)->alef(1993年)->go
(2)面向对象思想:algol->pascal->modula-2->oberon->-(object oberon)>oberon2->go
(3)c语言家族:Ken Thompson发明的B语言(1969年)->Dennis M.Ritchie发明的C语言(1972~1989年)逐步演化。
语言基础 数组、切片、字符串概述一般情况下数组和字符串数据结构使用最频繁,只有在不满足场景才会考虑链表、散列表(数组和链表的结合体)或更复杂的数据结构。这三个底层原始数据内存结构相同。
赋值和函数传参:都不会复制底层数据。字符串底层是字符数组,只读属性,无法修改底层数组元素,字符串只复制数据地址和长度;数组是整体复制;切片虽然底层也是对应数据类型的数组,但每个切片有独立的长度和容量信息,切片传参按切片头信息的部分(含有底层数据指针)按值传递方式。
总之,Go的赋值和函数传参规则很简单,都是传值方式处理。但是闭包对外部变量是引用方式访问。
数组1、固定长度、特定类型,长度是数组类型的一部分。只要长度或者元素类型不同,那就是不同的类型。所以Go很少直接使用数组(不同长度无法直接赋值)。切片可以动态增长和收缩,更灵活。
2、值语义,一个数组变量就表示整个数组。是一个完整的值。(eg:C中数组是隐式指向第一个元素指针),数组变量被赋值或传递,实际上复制整个数组,数组较大,会有较大开销,避免复制开销,可以传递数组指针。
3、通过数组指针访问数组元素写法和直接访问一样。数组是特殊的结构体,cap和len返回的结果相同。一般情况下for range迭代可以保证不会出现数组越界情况。
4、数组可以定义字符串数组、函数数组、结构体数组、接口数组、通道数组等等。
5、空数组(长度为0的数组)不占内存空间。可以用于通道同步操作,一般更倾向于无类型匿名结构代替空数组。
6、Go中,数组是字符串和切片的基础,对于数组的操作都可以用于字符串或切片中。



