之所以会写这篇文章,是因为在自学 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),如下图所示。

二、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 语言中还存在着一些特殊的标识符,叫做预定义标识符,如下表所示:

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

关键字

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

四、认证体系

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

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

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

全套视频教程+笔记

配套技术文档

大厂面试题汇总

实战项目

最后把我整理的关于 go 的电子书在这里分享给大家,这些资料用于学习分享,请勿用于商业目的。需要获取的话点击领取就可以了

资料包https://docs.qq.com/doc/DZFR4THdNS1lieXRI?&u=51169acf38a94deebd6f04d8f678a917

为什么我们要学go语言?go语言的优势相关推荐

  1. 对话微软黄学东:语音语言技术是镶在 AI 皇冠上的明珠

    来源:AI科技评论 AI 科技评论按:上一次你和你的电脑进行有意义的对话,并感受到它能真正地理解你,是什么时候?如果微软技术研究员.微软的语言语音小组组长黄学东博士做到了的话,那么你也将可以做到.并且 ...

  2. c语言写贪吃蛇什么水平_学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释...

    已结贴√ 问题点数:20 回复次数:3 学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释 #include//基本库 #include//系统库 #i ...

  3. C++ 是一门难学易用的语言!

    译 序 C++ 是一门难学易用的语言! C++ 的难学,不仅在其广博的语法.语法背后的语义.语义背后的深层思维.深层思维背后的对象模型:C++ 的难学,还在于它提供了4种不同(相辅相成)的编程思维模型 ...

  4. c语言的学生理系统,C语言学习系统的教程

    完美者(wmzhe.com)网站以软件下载为基础,改版后的网站对功能性板块进行扩充,以期能够解决用户在软件使用过程中遇见的所有问题.网站新增了"软件百科"."锦囊妙技&q ...

  5. 河北工程大学c语言期末考试及答案,河北工程大学之数据结构c语言版期末考试复习试题...

    河北工程大学之数据结构c语言版期末考试复习试题 <数据结构与算法>复习题 一.选择题. 1.在数据结构中,从逻辑上可以把数据结构分为 C . A.动态结构和静态结构 B.紧凑结构和非紧凑结 ...

  6. 程序员入门c语言还是java,先学java还是c语言?入门学哪种语言?

    很多刚接触编程语言的小伙伴都会有一个疑问先学 Java 还是 C 语言?今天 W3Cschool 小编就来和大家简单介绍一些,做个对比相信小伙伴们能够自行作出适合自己的判断. 在探讨先学 Java 还 ...

  7. 天津工业大学c语言题库,天津工业大学计算机专业C语言经典笔记

    天津工业大学计算机专业C语言经典笔记 经典笔记 1. 将一个二维数组的行和列的元素互换存到另一个数组里. #include main() { int a[2][3]={{1,2,3},{4,5,6}} ...

  8. 3.4 学编程不拘于语言,学语言不限于平台——《逆袭大学》连载

    返回到[全文目录] 目录 3.4 学编程不拘于语言,学语言不限于平台 编程语言 软件和硬件--计算机要作为一个整体看待 语言的江湖 语言不是回事 多平台上的精彩 3.4 学编程不拘于语言,学语言不限于 ...

  9. 中北c语言程序设计,中北大学软件学2013届C语言程序设计实训题目.doc

    中北大学软件学2013届C语言程序设计实训题目 C语言程序课程设计题目 (孟龙)题目1:年历显示 功能要求: 输入一个年份,输出是在屏幕上显示该年的日历.假定输入的年份在1940-2040年之间. 输 ...

  10. 河南工业大学c语言考试题库,c语言题库(编程)河南工业大学 河工大 c语言期末考试题库...

    c语言题库(编程)河南工业大学 河工大 c语言期末考试题库 (27页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 C语言题库编程河南工业 ...

最新文章

  1. 详细谈电脑ip、域名、内网、外网、localhost、127.0.0.1、网关等通讯基础知识(易懂)
  2. linux ping程序设计与实现,一步步学Linux网络编程--ping命令的实现分析
  3. Cocos2d-x之Sprite
  4. ASP.NET WEBAPI设计(文摘)
  5. UVA 11210 Chinese Mahjong
  6. 【概率论与数理统计】如何理解自由度n?
  7. 网页图表Highcharts实践教程之标签组与载入动画
  8. 谷歌搜索白痴出来特朗普 CEO解释:算法匹配是这样
  9. mysql的其中连接方式_MySQL选择连接中的位置,但不在其中
  10. 读懂mysql慢查询日志
  11. redhat7 防火墙设置
  12. 信息安全密码学期末复习重点总结
  13. 用Python制作一个自动抢票脚本
  14. 2020版无人机组装与维修(芯片级)
  15. 如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴
  16. Android:修改电池容量
  17. Flash MX as 声音控制分解
  18. 在Linux中直接通过wget从网上下载jdk1.8
  19. WordPress大前端乐动体育指出:主题博客模板新增9个功能,修复7个bug
  20. 用VScode编写LaTex-最新教程2022/4/17

热门文章

  1. 鬼谷算题,你可知道解法?
  2. pyqtgraph文档笔记(四)在 pyqtgraph 中绘图
  3. ZYNQ 7000 PS和PL 信号、接口、管脚分布
  4. Mysql连接异常解决方法
  5. python char数组_Python char数组声明
  6. 由Python位运算到原码反码补码
  7. Solidworks 无法获得下列许可,许可证不一致的解决办法
  8. hint: See the ‘Note about fast-forwards‘ in ‘git push --help‘ for details.
  9. 总投资95.6亿元|盛泽镇今年将实施82个重点项目
  10. HDU 4122 Alice's mooncake shop 单调队列优化dp