之所以会写这篇文章,是因为在自学 Go 语言的过程,总会有些困惑和迷茫,总希望更好地学习下去,因此有了一些想法,在这里梳理一下,以便日后回过头来也可以看看此时此刻的想法。

一. Go 语言的出现

在具体学习 go 语言的基础语法之前,我们来了解一下 go 语言出现的时机及其特点。

Go 语言最初由 Google 公司的 Robert Griesemer、Ken Thompson 和 Rob Pike 三个大牛于 2007 年开始设计发明,他们最终的目标是设计一种适应网络和多核时代的 C 语言。所以 Go 语言很多时候被描述为“类 C 语言”,或者是“21 世纪的 C 语言”,当然从各种角度看,Go 语言确实是从 C 语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想。但是 Go 语言更是对 C 语言最彻底的一次扬弃,它舍弃了 C 语言中灵活但是危险的指针运算,还重新设计了 C 语言中部分不太合理运算符的优先级,并在很多细微的地方都做了必要的打磨和改变。

Go 语言其实是 Golanguage 的简称,Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译并发型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。该语言的吉祥物为金花鼠(gordon),如下图所示。

go语言基础教程视频 go语言入门经典_go语言基础教程视频

二、G 语言的理论学习

1、go 接口

所有接口的父接口是一个空类,interface{}替代任意类型

2、go 泛型

go1.7 之前的 go 泛型实现是使用 interface{}替代任意类型,需要使用 swich 做类型断言判断。1.7 之后引入了类似 java 语言的泛型概念,这种泛型概念就是模板<K,V>,在程序运行时需要 copy 一份模板生成对应类型的方法并写入内存中,故泛型系统程序运行时复杂性提升。

3、o 引用类型

切片、map(字典)、channel(管道),接口,指针 这五种在 go 中是引用类型,其余类型为值类型。引用类型的引用存在内存栈中,值存在堆内存中。go 垃圾回收器 GC 回收的是堆内存中没有引用的空间。也就是说引用类型若要回收时只需要将引用指向 nil 即可。

在变量传递(函数传参)时,值类型数据是拷贝专递。引用类型是地址传递,在函数传参时,如果是值传递,修改被传递的参数不会影响原有变量,如果是引用传递,函数内部修改会影响外界。

4、切片和数组的显著区别

切片是一个引用类型,数组是一个值类型。数组一旦创建大小是固定的。切片底层也是数据,切片在运行时可以动态增加大小。切片是可以动态双倍扩容的,使用的是数组内置的添加,复制功能。

切片的方法

len() 返回切片中元素的个数

cap() 返回切片的容量

5、go 语言中的列表和字典

列表:list.List ; 声明:var name list.List    or     name := list.List。列表的底层数据结构是双向链表。

字典:map,提供映射关系的容器,其内部是通过散列表实现的

6、go select

select 可以随机选择一条 channel 没有读写阻塞的 case 执行。实际上就是找到没有阻塞的 channel。

7、一个协程如何等其余协程执行完成之后再执行

        等待组:sync.WaitGroup。在等待预设数量的协程都执行并且结束后,才会向下执行。

                                waitGroup.add(5) //设置执行的协程数

                                waitGroup.Done()//一个协程执行完成后减一的动作

                                waitGroup.wait()//等待协程等待

        另一种办法:给一个共用参数(切片)等待携程看这个共用参数信号确定是否执行

8、死锁

死锁:主协程被阻塞

避免方式:

不能单个协程自读自写一个没有缓冲能力的 channel

A 协程要求 B 协程先写入自己在读出,B 协程要求 A 协程先读出自己再写入。此时 AB 死锁

在 range channel 时,要注意 channel 的写入关闭,如果不关闭管道,range channel 就永远阻塞

9、go 的 channel 有缓冲和没缓冲的区别

有缓冲的管道:即使没有写入,也能读出若干默认值。即使没有读出,也能写入若干值。

无缓冲的管道:只要没有协程写入就读出阻塞。没有协程读出,就写入阻塞。

10、go 为啥可以高并发

G-M-P 模型

当一个线程运行在某一个 cpu 的核上,这个线程下可能会有很多个协程(微协程),当前有其中一个协程处于运行状态,其余的在协程队列中排队等待。

实际 M(物理线程)之间的调度是在操作系统上完成的,效率低下。go 则是一个 M(物理态线程)下挂有一个逻辑态的协程队列,其调度是逻辑调度,不在操作系统层面调度。则效率高。

三、GO 语言的技能学习

GO 标识符 关键字 变量 常量

标识符

标识符是指 Go 语言对各种变量、方法、函数等命名时使用的字符序列,标识符由若干个字母、下划线_、和数字组成,且第一个字符必须是字母。通俗的讲就是凡可以自己定义的名称都可以叫做标识符。

下划线_是一个特殊的标识符,称为空白标识符,它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用_作为变量对其它变量进行赋值或运算。

在使用标识符之前必须进行声明,声明一个标识符就是将这个标识符与常量、类型、变量、函数或者代码包绑定在一起。在同一个代码块内标识符的名称不能重复。

标识符的命名需要遵守以下规则:

a. 由 26 个英文字母、0~9、_组成;

b. 不能以数字开头,例如 var 1num int 是错误的;

c. Go 语言中严格区分大小写;

d. 标识符不能包含空格;

d. 不能以系统保留关键字作为标识符,比如 break,if 等等。

命名标识符时还需要注意以下几点:

a. 标识符的命名要尽量采取简短且有意义;

b. 不能和标准库中的包名重复;

c. 为变量、函数、常量命名时采用驼峰命名法,例如 stuName、getVal;

当然 Go 语言中的变量、函数、常量名称的首字母也可以大写,如果首字母大写,则表示它可以被其它的包访问(类似于 Java 中的 public);如果首字母小写,则表示它只能在本包中使用 (类似于 Java 中 private)。

在 Go 语言中还存在着一些特殊的标识符,叫做预定义标识符,如下表所示:

go语言基础教程视频 go语言入门经典_golang_02

预定义标识符一共有 36 个,主要包含 Go 语言中的基础数据类型和内置函数,这些预定义标识符也不可以当做标识符来使用。

关键字

关键字是 Go 语⾔预先定义好的,有特殊含义的标识符。共 25 个。

go语言基础教程视频 go语言入门经典_go语言基础教程视频_03

四、认证体系

CKA: Kubernetes 管理员认证(CKA)旨在确保认证持有者具备履行 Kubernetes 管理员职责的技能,知识和能力。CKA 认证可帮助经过认证的管理员在就业市场中快速建立自己的信誉和价值,并能帮助公司更快地雇用高质量的团队来支持他们的发展

如果企业想要申请 KCSP,条件之一是:至少需要三名员工拥有 CKA 认证

CKAD: Kubernetes 应用程序开发人员认证(CKAD)旨在确保 CKAD 具备履行 Kubernetes 应用程序开发人员职责的技能,知识和能力。 经过认证的 Kubernetes Application Developer 可以定义应用程序资源并使用核心原语来构建,监视和排除 Kubernetes 中可伸缩应用程序和工具的故障

全套视频教程+笔记

go语言基础教程视频 go语言入门经典_学习_04

 

go语言基础教程视频 go语言入门经典_学习_05

配套技术文档

go语言基础教程视频 go语言入门经典_go语言基础教程视频_06

大厂面试题汇总

go语言基础教程视频 go语言入门经典_学习_07

 

go语言基础教程视频 go语言入门经典_jvm_08

实战项目

go语言基础教程视频 go语言入门经典_学习_09