肝了 10 万字 ,Go 语言保姆级编程教程2021最新版(建议收藏)
Posted 极客江南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了肝了 10 万字 ,Go 语言保姆级编程教程2021最新版(建议收藏)相关的知识,希望对你有一定的参考价值。
友情提示:编辑器显示 12 万 多字,先点赞,关注,收藏,一键三连支持,再学习。
本文对比 C 语言进行学习 Go 语言,如果你有 C 语言基础,学习 Go 语言会容易很多。
Go 语言保姆级教程目录
- 什么是Go语言
- Go语言优势
- Go语言发展史
- Go作者
- Go语言现状
- Go语言应用场景
- 如何学习Go语言
- 源文件对比
- 代码管理对比
- 关键字对比
- 数据类型对比
- 常量变量对比
- 注释对比
- 运算符对比
- 流程控制语句对比
- 函数和方法对比
- 编程思想对比
- 其它新增特性
- Go语言SDK安装和配置
- 安装Go语言开发工具
- Goland安装
- Go语言程序组成
- Go语言程序主函数定义格式
- Go语言HelloWorld
- Go语言HelloWorld和C语言HelloWorld异同
- Go语言注释
- Go语言编码风格
- 关键字
- C语言关键字和Go语言关键字对比
- 标识符
- Go语言数据类型
- Go语言变量
- Go语言变量定义注意点
- 局部变量和全局变量
- 数据类型转换
- 数值类型和字符串类型之间转换
- Go语言常量
- 输入函数
- go命令行操作指令
- 通过os包获取命令行参数
- 通过flag包获取命令行参数
- os包和flag包获取命令行参数对比
- 算数运算符
- 关系算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 其它运算符
- 运算符优先级
- Go语言流程控制基本概念
- 选择结构if
- 选择结构switch
- 循环结构for
- 四大跳转
- 函数
- 和C语言函数差异
- 值传递和引用传递
- 匿名函数
- 闭包
- 延迟调用
- init函数
- 数组
- 一维数组
- 二维数组
- 切片
- map(字典、映射)
- 结构体
- 普通指针
- 指向数组指针
- 指向切片的指针
- 指向字典指针
- 指向结构体指针
- 指针作为函数参数和返回值
- 方法
- 接口
- 面向对象基本概念
- 面向对象思想
- 面向对象和面向过程区别
- 面向对象的特点
- 类与对象的关系
- 如何设计一个类
- 如何分析一个类
- 如何定义一个类
- 如何通过类创建一个对象
- 不同包中变量、函数、方法、类型公私有问题
- 面向对象三大特性
- 异常处理
- 打印异常信息
- 中断程序
- 恢复程序
- 字符串相关方法
- 正则表达式
- 时间和日期函数
- Go语言中调用C语言函数
- C语言中调用Go语言函数(很少使用)
- 文件的打开和关闭
- 文件读取
- 文件创建和写入
- 判断文件是否存在
- 练习
- 并发编程基本概念
- 什么是串行?
- 什么是并行?
- 什么是并发?
- 什么是程序?
- 什么是进程?
- 什么是线程?
- 什么是协程?
- Go并发
- 多线程同步问题
- 生产者消费者问题
- 生产者和消费者资源竞争问题
- 管道(Channel)
- select选择结构
- 定时器补充
这篇文章可以说是一本书了,排版,码字耗费了很长的时间,10W+字 Go 语言从入门保姆级教程2021年版,觉得有价值记得一键三连支持。
什么是Go语言
- Go语言(Golang)是Google公司2009年推出的一门"高级编程言语", 目的是为了解决:
- "现有主流编程语言"明显落后于硬件发展速度的问题
- 不能合理利用多核CPU的优势提升软件系统性能的问题
- 软件复杂度越来越高, ***维护成本也越来越高***的问题
- 企业开发中不得不在***快速开发和性能之间艰难抉择***的问题
科普小知识:
1.静态语言:
1.1一般都需要通过编译器(compiler)将源代码翻译成机器码,之后才能执行。程序被编译之后无论是程序中的数据类型还是程序的结构都不可以被改变
1.2静态语言的性能和安全性都非常好, 例如C和C++、Go, 但是C和C++的缺点是开发速度慢, 维护成本高
2.动态语言
2.1一般不需要通过编译器将源代码翻译成机器码,在运行程序的时候才逐行翻译。程序在运行的过程中可以动态修改程序中的数据类型和程序的结构
2.2动态语言开发速度快,维护成本低,例如Ruby和Python, 但是Ruby和Python的性能和安全性又略低
- Go语言专门针对多核CPU进行了优化, 能够充分使用硬件多核CPU的优势, 使得通过Go语言编写的软件系统性能能够得到很大提升
- Go语言编写的程序,既可以媲美C或C++代码的运行速度, 也可以媲美Ruby或Python开发的效率
- 所以Go语言很好的解决了"现有主流编程语言"存在的问题, 被誉"现代化的编程语言"
Go语言优势
- 简单易学
- Go语言的作者都有C的基因,Go自然而然也有了C的基因,但是Go的语法比C还简单, 并且几乎支持大多数你在其他语言见过的特性:封装、继承、多态、反射等
- 丰富的标准库
- Go目前已经内置了大量的库,特别是网络库非常强大
- 前面说了作者是C的作者,所以Go里面也可以直接包含c代码,利用现有的丰富的C库
- 跨平台编译和部署
- Go代码可直接编译成机器码,不依赖其他库,部署就是扔一个文件上去就完事了. 并且Go代码还可以做到跨平台编译(例如: window系统编译linux的应用)
- 内置强大的工具
- Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难
- 性能优势: Go 极其地快。其性能与 C 或 C++相似。在我们的使用中,Go 一般比 Python 要快 30 倍左右
- 语言层面支持并发,这个就是Go最大的特色,天生的支持并发,可以充分的利用多核,很容易的使用并发
- 内置runtime,支持垃圾回收
- … …
Go语言的吉祥物是地鼠
地鼠的特点是速度快、成群结队、头脑简单
而Go语言的特点正好也是编程速度快、并发性好、简单易学
Go语言发展史
2007年,谷歌工程师Rob Pike, Ken Thompson和Robert Griesemer开始设计一门全新的语言,这是Go语言的最初原型。
2009年11月10日,Go语言以开放源代码的方式向全球发布。
2011年3月16日,Go语言的第一个稳定(stable)版本r56发布。
2012年3月28日,Go语言的第一个正式版本Go1发布。
2013年4月04日,Go语言的第一个Go 1.1beta1测试版发布。
2013年4月08日,Go语言的第二个Go 1.1beta2测试版发布。
2013年5月02日,Go语言Go 1.1RC1版发布。
2013年5月07日,Go语言Go 1.1RC2版发布。
2013年5月09日,Go语言Go 1.1RC3版发布。
2013年5月13日,Go语言Go 1.1正式版发布。
2013年9月20日,Go语言Go 1.2RC1版发布。
2013年12月1日,Go语言Go 1.2正式版发布。
2014年6月18日,Go语言Go 1.3版发布。
2014年12月10日,Go语言Go 1.4版发布。
2015年8月19日,Go语言Go 1.5版发布,本次更新中移除了”最后残余的C代码”。
2016年2月17日,Go语言Go 1.6版发布。
2016年8月15日,Go语言Go 1.7版发布。
2017年2月17日,Go语言Go 1.8版发布。
2017年8月24日,Go语言Go 1.9版发布。
2018年2月16日,Go语言Go 1.10版发布。
Go作者
- Go语言是UNIX作者、C语言作者、谷歌V8引擎作者携手打造的, 由谷歌公司2009年推出的一门高级编程言语。
跟着谷歌走吃喝啥都有
Go语言现状
-
多次获得TIOBE年度最佳语言
-
2018年Go语言一度超过Java, 进入编程语言排行榜前三名.
-
从公司角度:
- 许多大厂都已经拥抱 Go 语言,包括阿里巴巴、京东、今日头条、小米、滴滴、七牛云、360等明星公司, 也包括知乎、轻松筹、快手、探探、美图、猎豹移动等等。同时,创业公司也很喜欢 Go 语言,主要因为其入门快、程序库多、运行迅速,很适合快速构建互联网软件产品。
-
从业务维度:
- Go 程序可以在装有 Windows、Linux、FreeBSD 等操作系统的服务器上运行,并用于提供基础软件支撑、API 服务、Web 服务、网页服务等等。
- 在云计算、微服务、大数据、区块链、物联网等领域,Go 语言早已蓬勃发展. 除了语法简单, 性能优越以外, K8S底层架构在云计算的领导地位(
K8S就是Go开发的
), 也让这些各大公司不得不拥抱Go语言。 - 区块链的崛起更进一步带动了Go工程师的需求,市面上大部分区块链明星项目都是用Go开发的, 足以说明Go在分布式系统中的地位,这也就是为什么今年开始,大批金融公司开始招聘Go工程师的重要原因。
-
从薪资角度来看
- 应届生普遍在
4~8K
, 1年左右普遍在10K左右
, 2年~3年普遍在20K左右
- 应届生普遍在
Go语言应用场景
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用、内存数据库等
- 云平台开发,目前国外很多云平台在采用Go开
- 服务器编程, 以前你如果使用Java或者C++做的那些事情,都可以用Go来做
- 分布式系统,数据库代理器等
- 它可以做从底层到前端的任何工作
如何学习Go语言
- Go语言被称之为现代化的C语言, 所以无论是从语法特性, 还是作者本身, Go语言都与C语言有着莫大的关系, 所以学习本套课程之前如果你有C语言的基础, 那么将会事半功倍
- 对于初学者而言, 学习编程的捷径只有一条, 那就是多动手
竹子用了4年的时间, 仅仅长了3cm, 从第五年开始, 以每天30cm的速度疯狂地生长, 仅仅用了六周的时间就长到了15米。 其实,在前面的四年, 竹子将根在土壤里延伸了数百平米。 做人做事亦是如此, 不要担心你此时此刻的付出得不到回报, 因为这些付出都是为了扎根。
源文件对比
- C语言源文件
文件扩展名 | 源类型 |
---|---|
.h | 头文件,存放代码声明 |
.c | C语言源文件,存放代码实现 |
- Go语言源文件
文件扩展名 | 源类型 |
---|---|
.go | Go语言源文件,存放代码实现 |
代码管理对比
- C语言中通过文件来管理代码
- 想使用某一个函数时,只需要include导入对应的.h文件即可
- Go语言中通过包来管理代码
- Go语言没有.h文件的概念, 在Go中想使用某一个函数时, 只需要import导入对应的包即可
- C语言中函数、变量公私有管理
- 通过extern和static实现是否公开函数和变量
- Go语言中函数、变量公私有管理
- 通过函数名称首字母大小写实现是否公开函数
- 通过变量名称首字母大小写实现是否公开变量
关键字对比
- C语言中一共有32个关键字
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
if | else | switch | case | default | break | return | goto |
do | while | for | continue | typedef | struct | enum | union |
char | short | int | long | float | double | void | sizeof |
signed | unsigned | const | auto | register | static | extern | volatile |
- Go语言中一共有25个关键字
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
if | else | switch | case | default | break | return | goto |
fallthrough | for | continue | type | struct | var | const | map |
func | interface | range | import | package | defer | go | select |
chan |
数据类型对比
- C语言数据类型
- Go语言数据类型
- C语言各数据类型占用内存空间
类型 | 32位编译器 | 64位编译器 |
---|---|---|
char | 1 | 1 |
int | 4 | 4 |
float | 4 | 4 |
double | 8 | 8 |
short | 2 | 2 |
long | 4 | 8 |
long long | 8 | 8 |
void* | 4 | 8 |
- Go语言各数据类型占用内存空间
类型 | 32位编译器 | 64位编译器 | 本质 |
---|---|---|---|
int8/uint8 | 1 | 1 | signed char/unsigned char |
int16/uint16 | 2 | 2 | signed short/unsigned short |
int32/uint32 | 4 | 4 | signed int/unsigned int |
int64/uint64 | 8 | 8 | signed long long int/unsigned long long int |
byte | 1 | 1 | uint8/unsigned char |
rune | 4 | 4 | int32/signed int |
int | 4 | 8 | 根据机器位数决定长度 |
uintptr | 4 | 8 | 根据机器位数决定长度 uint32/uint64 |
float32 | 4 | 4 | float |
float64 | 8 | 8 | double |
true | 1 | 1 | char类型的整型 |
false | 1 | 1 | char类型的整型 |
- 和C语言一样,Go语言也提供了Sizeof计算变量的内存空间
- 1.导入import "unsafe"包
- 2.通过unsafe.Sizeof()计算变量内存空间
- Go语言基本数据类型内部实现
- golang官方网站下载go1.4版本源代码
- 越老版本的代码越纯粹,越适合新手学习
- 随着代码的更新迭代会逐步变得非常复杂, 所以此处建议下载1.4版本
- 解压后打开路径:
go\\src\\runtime\\runtime.h
- 得到如下实现代码
- golang官方网站下载go1.4版本源代码
// 第8行到35行
typedef signed char int8;
typedef unsigned char uint8;
typedef signed short int16;
typedef unsigned short uint16;
typedef signed int int32;
typedef unsigned int uint32;
typedef signed long long int int64;
typedef unsigned long long int uint64;
typedef float float32;
typedef double float64;
#ifdef _64BIT
typedef uint64 uintptr;
typedef int64 intptr;
typedef int64 intgo; // Go's int
typedef uint64 uintgo; // Go's uint
#else
typedef uint32 uintptr;
typedef int32 intptr;
typedef int32 intgo; // Go's int
typedef uint32 uintgo; // Go's uint
#endif
#ifdef _64BITREG
typedef uint64 uintreg;
#else
typedef uint32 uintreg;
#endif
// 第153行到157行
enum
{
true = 1,
false = 0,
};
install B 时刻:
Go本质就是用C语言编写的一门高级编程语言
所以江哥前面教你C语言就是为了今天能让你看懂Go的实现代码,做到知其然知其所以然
常量变量对比
- C语言定义常量和变量格式
数据类型 变量名称 = 值;
const 数据类型 常量名称 = 值;
- Go语言定义常量和变量格式
- 除了以下标准格式外,Go语言还提供了好几种简单的语法糖
var 变量名称 数据类型 = 值;
const 变量名称 数据类型 = 值;
注释对比
- 和C语言一样,Go语言也支持单行注释和多行注释, 并且所有注释的特性都和C语言一样
- 单行注释
// 被注释内容
- 多行注释
/* 被注释内容*/
- 单行注释
- 在Go语言中,官方更加推荐使用单行注释,而非多行注释(详情可以直接查看Go官方源码)
运算符对比
- 算数运算符和C语言几乎一样
- Go语言中++、–运算符不支持前置
- 错误写法: ++i; --i;
- Go语言中++、–是语句,不是表达式,所以必须独占一行
- 错误写法: a = i++; return i++;
- Go语言中++、–运算符不支持前置
运算符 | 描述 | 实例 |
---|---|---|
+ | 相加 | A + B |
- | 相减 | A - B |
* | 相乘 | A * B |
/ | 相除 | B / A |
% | 求余 | B % A |
++ | 自增 | A++ |
– | 自减 | A– |
- 关系算符和C语言一样
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个值是否相等,如果相等返回 True 否则返回 False。 | A == B |
!= | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 | A != B |
> | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 | A > B |
< | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 | A < B |
>= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 | A >= B |
<= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 | A <= B |
- 逻辑运算符和C语言一样
运算符 | 描述 | 实例 |
---|---|---|
&& | 如果两边的操作数都是 True,则条件 True,否则为 False。 | A && B |
\\|\\| | 如果两边的操作数有一个 True,则条件 True,否则为 False。 | A || B |
! | 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | !A |
- 位运算符和C语言几乎一样
- 新增一个&^运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 参与运算的两数各对应的二进位相与, 对应位只要都是1结果就为1 | A & B |
\\| | 参与运算的两数各对应的二进位相或,对应位只要其中一个是1结果就为1 | A | B |
^ | 参与运算的两数各对应的二进位相异或,对应位只要不同结果就是1 | A ^ B |
<< | 左移运算符,左移n位就是乘以2的n次方 | A << 2 |
>> | 右移运算符,右移n位就是除以2的n次方 | B >> 2 |
&^ | 逻辑清零运算符, B对应位是1,A对应位清零,B对应位是0, A对应位保留原样 | A &^ B |
int main(){
/*
0110 a
&^1011 b 如果b位位1,那么结果为0, 否则结果为a位对应的值
----------
0100
*/
a1 := 6
b1 := 11
res1 := a1 &^ b1
fmt.Println("res1 = ", res1) // 4
/*
1011 a
&^1101 b 如果b位位1,那么结果为0, 否则结果为a位对应的值
----------
0010
*/
a2 := 11
b2 := 13
res2 := a2 &^ b2
fmt.Println("res2 = ", res2) // 2
}
- 赋值运算符和C语言几乎一样
- 新增一个&^=运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 将右边赋值给左边 | C = A + B 将 A + B 表达式结果赋值给 C |
+= | 相加后再赋值 | C += A 等于 C = C + A |
-= | 相减后再赋值 | C -= A 等于 C = C - A |
*= | 相乘后再赋值 | C *= A 等于 C = C * A |
/= | 相除后再赋值 | C /= A 等于 C = C / A |
%= | 求余后再赋值 | C %= A 等于 C = C % A |
<<= | 左移赋值 | C <<= 2 等于 C = C << 2 |
>>= | 右移赋值 | C >>= 2 等于 C = C >> 2 |
&= | 位逻辑与赋值 | C &= 2 等于 C = C & 2 |
^= | 位逻辑或赋值 | C ^= 2 等于 C = C ^ 2 |
\\|= | 位逻辑异或赋值 | C |= 2 等于 C = C | 2 |
&^= | 位逻辑清零赋值 | C &^= 2 等于 C = C &^ 2 |
流程控制语句对比
- C语言流程控制中的if、switch、for在Go语言都可以使用
- C语言中的四大跳转语句return、break、continue、goto在Go语言都可以使用
- Go语言除了实现C语言中if、switch、for、return、break、continue、goto的基本功能以外,还对if、switch、for、break、continue进行了增强
- 例如: if 条件表达式前面可以添加初始化表达式
- 例如: break、continue可以指定标签
- 例如: switch语句可以当做if/elseif来使用
- … …
- 值得注意的是Go语言中没有while循环和dowhile循环, 因为它们能做的Go语言中的for循环都可以做
函数和方法对比
- C语言定义函数格式
返回值类型 函数名称(形参列表) {
函数体相关语句;
return 返回值;
}
- Go语言定义函数格式
func 函数名称(形参列表)(返回值列表) {
函数体相关语句;
return 返回值;
}
- C语言中没有方法的概念, 但是Go语言中有方法
- 对于初学者而言,可以简单的把方法理解为一种特殊的函数
func (接收者 接受者类型)函数名称(形参列表)(返回值列表) {
函数体相关语句;
return 返回值;
}
编程思想对比
- C语言是一门面向过程的编程语言
- 面向过程: 按部就班, 亲力亲为,关注的是我应该怎么做?
- 做饭例子: 面向过程做饭
- 1.上街买菜
- 2.摘菜
- 3.洗菜
- 4.切菜
- 5.开火炒菜
- 6.淘米煮饭
- 7.吃饭
- Go语言是门面向对象的编程语言
- 面向对象:化繁为简, 能不自己干自己就不干,关注的是我应该让谁来做?
- 做饭例子: 面向对象做饭
- 1.找个会做饭女朋友 or 男朋友
- 2.老婆我饿了 or 老公我饿了
- 3.躺着…等她/他把饭做好
- 4.吃饭
- 不要把面向过程和面向对象想象得那么神奇, 它们只是思考问题的方式不同而已
其它新增特性
- 接口
- 并发
- 反射
- 异常处理
- …
Go语言SDK安装和配置
-
什么是SDK
- 软件开发工具包(外语首字母缩写:SDK、外语全称:**SoftwareDevelopmentKit)**一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合
- 如果不安装SDK, 你可以编写Go语言代码, 但是你不能编译执行编写好的Go语言代码
-
如何安装?
-
1.下载SDK安装包。地址: https://golang.google.cn/dl/
- 由于新版本一般不太稳定, 所以我们选择下载上一个版本
- 由于新版本一般不太稳定, 所以我们选择下载上一个版本
-
2.运行图形化安装包
-
3.检测配置环境变量
- 3.1.添加GOROOT环境变量
- 用于告诉操作系统,我们把Go语言SDK安装到哪了
- 用于告诉操作系统,我们把Go语言SDK安装到哪了
- 3.1.添加GOROOT环境变量
- 3.2.配置GOPATH环境变量
- 用于告诉操作系统,将来我们要在哪里编写Go语言程序
- 用于告诉操作系统,将来我们要在哪里编写Go语言程序
- 3.3.配置GoBin环境变量
- 用于告诉操作系统,去哪查找Go语言提供的一些应用程序
- 用于告诉操作系统,去哪查找Go语言提供的一些应用程序
- 最终结果
- 4.检查是否安装配置成功
- 4.1打开CMD
- 4.2输入
go version
- 4.3输入
go env
- 4.1打开CMD
安装Go语言开发工具
- 记事本(开发效率极低)
- Vim(初学者入门门槛高)
- VSCode(不喜欢)
- Sublime Test(不喜欢)
- GoLand(喜欢,当收费)
- LiteIDE(开源免费, 跨平台运行,轻量级)
- 生男生女都一样, 最关键是你中意哪个就用哪个
Goland安装
- 下载安装包: 点我下载Goland
- 提取码:lm7v
- 运行安装文件
- 疯狂下一步
- 激活程序: 自行淘宝
JetBrains 激活
(仅供学生党参考, 在职人员请支持正版)
- 看不习惯英文的可以自行百度
Goland汉化包
- 打开项目文件夹
- 测试开发工具是否安装正确
- 其它问题:
- 提示没有安装JVM
- 下载Java SDK 点我下载
- 安装即可
- 提示没有安装JVM
Go语言程序组成
- 和C语言程序一样,Go语言程序也是由众多函数组成的
- 和C语言程序一样,程序运行时系统会***自动调用***名称叫做***main的函数***
- 和C语言程序一样,如果一个程序***没有主函数***,则这个程序***不具备运行能力***
- 和C语言程序一样,一个Go语言程序***有且只能有一个主函数***
Go语言程序主函数定义格式
- C语言main函数格式
int main(int argc, const char * argv[]) {
return 0;
}
- Go语言main函数格式
- func 告诉系统这是一个函数
- main主函数固定名称
- 函数左括号必须和函数名在同一行
- main函数必须在main包中
// 告诉系统当前编写的代码属于哪个包
package main
// 定义了一个名称叫做main的函数
func main() {
}
Go语言HelloWorld
package main // 告诉系统当前代码属于main这个包
import "fmt" // 导入打印函数对应的fmt包
func main() {
// 通过包名.函数名称的方式, 利用fmt包中的打印函数输出语句
fmt.Println("Hello World!!!")
}
Go语言HelloWorld和C语言HelloWorld异同
- 1.文件类型不同
- C语言代码保存在.c为后缀的文件中
- Go语言代码保存在.go为后缀的文件中
- 2.代码管理方式不同
- C语言程序用***文件***的方式管理代码
- C语言会把不同类型的代码放到不同的.c文件中, 然后再编写对应的.h文件
- 需要使用时直接通过#include导入对应文件的.h文件即可
- Go语言程序用包的形式管理代码
- 我们会把不同类型的代码放到不同的.go文件中,然后通过package给该文件指定一个包名
- 需要使用时直接通过import导入对应的包名即可
- C语言程序用***文件***的方式管理代码
- 3.main函数书写文件不同
- C语言中main函数可以写在任意文件中, 只要保证一个程序只有一个main函数即可
- Go语言中main函数只能写在包名为main的文件夹中, 同样需要保存一个程序只有一个main函数
- 4.函数编写的格式不同
- C语言中函数的格式为
- 注意:C语言函数的左括号可以和函数名称在同一行, 也可以不在同一行
- C语言中函数的格式为
返回值类型 函数名称(形参列表) {
函数体相关语句;
return 返回值;
}
- Go语言函数定义格式
注意:Go语言函数的左括号必须和函数名称在同一行,否则会报错
func 函数名称(形参列表)(返回值列表) {
函数体相关语句;
return 返回值;
}
- 5.函数调用的格式不同
- C语言通过#include导入.h文件后,直接通过函数名称调用函数
- Go语言通过import导入对应的包后,需要通过包名.函数名称的方式调用
#include <stdio.h>
#include "calculate.h"
int main()
{
int res = sum(2, 3); // 直接利用函数名称调用函数
printf("res = %d!\\n", res);
return 0;
}
package main
import (
"fmt"
"lesson_1/calculate"
)
func main() {
res := calculate.Sum(2, 3) // 使用包名.函数名称调用函数
fmt.Println("res1 = ", res)
}
- 6.语句的结束方式不同
- C语言中每条语句都必须以分号结尾
- Go语言中每条语句后面不用添加分号(编译器会自动添加)
#include <stdio.h>
#include "calculate.h"
int main()
{
int res = sum(2, 3); // 不写分号会报错
printf("res = %d!\\n", res); // 不写分号会报错
return 0; // 不写分号会报错
}
package main
import (
"fmt"
"lesson_1/calculate"
)
func main() {
res := calculate.Sum(2, 3) // 不用写分号
fmt.Println("res1 = ", res) // 不用写分号
}
Go语言注释
- 和C语言一样,Go语言也支持单行注释和多行注释, 并且所有注释的特性都和C语言一样
- 单行注释
// 被注释内容
- 多行注释
/* 被注释内容*/
- 单行注释
- 在Go语言中,官方更加推荐使用单行注释,而非多行注释(详情可以直接查看Go官方源码)
Go语言编码风格
- 1.go程序编写在.go为后缀的文件中
- 2.包名一般使用文件所在文件夹的名称
- 2.包名应该简洁、清晰且全小写
- 3.main函数只能编写在main包中
- 4.每一条语句后面可以不用编写分号(推荐)
- 5.如果没有编写分号,一行只能编写一条语句
- 6.函数的左括号必须和函数名在同一行
- 7.导入包但没有使用包编译会报错
- 8.定义局部变量但没有使用变量编译也会报错
- 9.定义函数但没有使用函数不会报错
- 10.给方法、变量添加说明,尽量使用单行注释
关键字
- Go语言中的关键字和C语言中的关键字的含义样, 是指被Go语言赋予特殊含义的单词
- Go语言中关键字的特征和C语言也一样
- 全部都是小写
- 在开发工具中会显示特殊颜色
- Go语言中关键字的注意点和C语言也一样
- 因为关键字在C语言中有特殊的含义, 所以不能用作变量名、函数名等
C语言关键字和Go语言关键字对比
- C语言中一共有32个关键字
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
if | else | switch | case | default | break | return | goto |
do | while | for | continue | typedef | struct | enum | union |
char | short | int | long | float | double | void | sizeof |
signed | unsigned | const | auto | register | static | extern | volatile |
- Go语言中一共有25个关键字
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
if | else | switch | case | default | break | return | goto |
fallthrough | for | continue | type | struct | var | const | map |
func | interface | range | import | package | defer | go | select |
chan |
- Go语言中除了关键字以外,还有30多个
预定义标识符
内建常量 | |||
---|---|---|---|
true | false | iota | nil |
內建类型 | |||
---|---|---|---|
int | int8 | int16 | int32 |
int64 | uint | uint8 | uint16 |
uint32 | uint64 | uintptr | float32 |
float64 | complex64 | complex128 | bool |
byte | rune | string | error |
內建函数 | |||
---|---|---|---|
make | len | cap | new |
append | copy | delete | real |
imag | panic | recover | complex |
标识符
- Go语言中的标识符和C语言中的标识符的含义样, 是指程序员在程序中自己起的名字(变量名称、函数名称等)
- 和C语言一样Go语言标识符也有一套
命名规则
, Go语言标识符的命名规则几乎和C语言一模一样- 只能由字母(a~z、 A~Z)、数字、下划线组成
- 不能包含除下划线以外的其它特殊字符串
- 不能以数字开头
- 不能是Go语言中的关键字
- 标识符严格区分大小写, test和Test是两个不同的标识符
- 和C语言标识符命名规则不同的是
- Go语言中_单独作为标识符出现时, 代表
空标识符
, 它对应的值会被忽略
package main import "fmt" func main() { // 将常量10保存到名称叫做num的变量中 var num int = 10 fmt.Println("num = ", num) // 忽略常量20,不会分配存储空间,也不会保存常量20 //var _ int = 20 //fmt.Println("_ = ", _) // cannot use _ as value // Go语言中如果定义了变量没有使用, 那么编译会报错(sub declared and not used) // 所以如果我们只使用了sum,没有使用sub会报错 // 为了解决这个问题, 我们可以使用_忽略sub的值 //var sum, sub int = calculate(20, 10) var sum, _ int = calculate(20, 10) fmt.Println("sum = ", sum) } func calculate(a, b int)(int, int) { var sum int = a + b var sub int = a - b return sum, sub } ```go + Go语言默认的编码方式就是UTF-8, 所以Go语言支持中文, 所以可以用中文作为标识符(非常非常非常不推荐) ```go package main import "fmt" func main() { // 不会报错, 可以正常运行 var 年龄 int = 33 fmt.Println("年龄 = ", 年龄) // 33 // 不会报错, 可以正常运行 var 结果 int = 计算器(10, 20) fmt.Println("结果 = ", 结果) // 30 } func 计算器(第一个变量, 第二个变量 int)int { return 第一个变量 + 第二个变量 }
- Go语言中_单独作为标识符出现时, 代表
- 和C语言一样,标识符除了有
命名规则
以外,还有标识符命名规范
- 规则必须遵守, 规范不一定要遵守, 但是建议遵守
- Go语言的命名规范和C语言一样, 都是
以上是关于肝了 10 万字 ,Go 语言保姆级编程教程2021最新版(建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章
爆肝了 13 万字后,又录了169 集配套保姆级 C 语言视频!(建议收藏)
爆肝了 13 万字后,又录了169 集配套保姆级 C 语言视频!(建议收藏)