Go语言基础 | 豆包MarsCode Al刷题

108 阅读10分钟

Go语言

前言

作为一个刚刚接触Go的新手小白,字节的内部课还是比较快的。因此斗胆在这里分享一下自己学习的笔记。

为什么要学习Go语言

在学习一门新语言的时候,肯定都需要了解为什么要学这门语言。

“Go是一种开源的程序设计语言,它意在是的人们能够方便地构建简单、可靠、高效的软件。”(来自Go官网golang.org

最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。

Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美 C / C++代码的速度,而且更加安全、支持并行进程

作为出现在21世纪的语言,其近C的执行性能和近解析型语言的开发效率,以及近乎于完美的编译速度,已经风靡全球。

特别是在云项目中,大部分都使用了Golang来开发。PC、移动端、云时代不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。

很多人将Go语言称为21世纪的C语言,因为Go不仅拥有C的简洁和性能。而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性。

被称为Go语言之父的罗勃·派克(Rob Pike)就曾说过,你是否同意Go语言,取决于你是认可少就是多,还是少就是少(Less is more or less is less)。Go语言的整个设计哲学就是:将简单、实用体现得淋漓尽致。 学习起来很轻松,很容易学习

如今 Go 已经是云计算编程语言,GO语言背靠Google这棵大树,又不乏牛人坐镇,是名副其实的“牛二代”。 想象一下:一个只有十几年发展经历的编程语言,已经成为了如此巨大而且正在不断发展的行业的主导者,这种成功是每个人都无法想象的。

Go语言常用库

学习编程语言,早已不是学一点语法规则那么简单。现在更习惯称作选择 Ecosystem(生态圈),而这其中标准库的作用和分量尤为明显。

在Go语言的安装文件里包含了一些可以直接使用的包,即标准库。Go语言的标准库(通常被称为语言自带的电池),提供了清晰的构建模块和公共接口,包含 I/O 操作、文本处理、图像、密码学、网络和分布式应用程序等,并支持许多标准化的文件格式和编解码协议。

Go语言的编译器也是标准库的一部分,通过词法器扫描源码,使用语法树获得源码逻辑分支等。Go语言的周边工具也是建立在这些标准库上。在标准库上可以完成几乎大部分的需求。

Go语言的标准库以包的方式提供支持,下表列出了Go语言标准库中常见的包及其功能。

Go语言标准库包名功 能
bufio带缓冲的 I/O 操作
bytes实现字节操作
container封装堆、列表和环形列表等容器
crypto加密算法
database数据库驱动和接口
debug各种调试文件格式访问及调试功能
encoding常见算法如 JSON、XML、Base64 等
flag命令行解析
fmt格式化操作
goGo语言的词法、语法树、类型等。可通过这个包进行代码信息提取和修改
htmlHTML 转义及模板系统
image常见图形格式的访问及生成
io实现 I/O 原始访问接口及访问封装
math数学库
net网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等
os操作系统平台不依赖平台操作封装
path兼容各操作系统的路径操作实用函数
pluginGo 1.7 加入的插件系统。支持将代码编译为插件,按需加载(一个完整的go环境是很大也,只放需要的部分)
reflect语言反射支持。可以动态获得代码中的类型信息,获取和修改变量的值
regexp正则表达式封装
runtime运行时接口
sort排序接口
strings字符串转换、解析及实用函数
time时间接口
text文本模板及 Token 词法器

当然,优秀第三方资源也是语言生态圈的重要组成部分。

Go语言代码清爽

Go语言语法类似于C语言,因此熟悉C语言的人都会迅速熟悉这门语言。

C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的基础上取其精华,弃其糟粕,将C语言中较为容易发生错误的写法进行调整,做出相应的编译提示。

去掉循环冗余括号

下面的代码是C语言的数值循环:

// C语言的for数值循环
for(int a = 0;a<10;a++){
    // 循环代码
}

在Go语言中,这样的循环变为:

for a := 0;a<10;a++{
    // 循环代码
}

for 两边的括号被去掉,int 声明被简化为:=,直接通过编译器右值推导获得 a 的变量类型并声明。

去掉表达式冗余括号

同样的简化也可以在判断语句中体现出来,以下是C语言的判断语句:

if (表达式){
    // 表达式成立 

在Go语言中,无须添加表达式括号,代码如下:

if 表达式{
    // 表达式成立
}

不再纠结于i++和++i

C语言非常经典的考试题为:(太典了)

int a, b;
a = i++;
b = ++i;

类似的还有:

int x = 5, y;
y = ++x*--x;
//求变量y的值

(如果我以后手握大权,直接把这样写的给开了——纯纯刁难我)

而在Go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在Go语言中自增只有一种写法:

i++

如果写成前置自增++i,或者赋值后自增a=i++都将导致编译错误。

两个数字交换

a := 1
b := 2
a, b = b, a

这让编译器自动执行,不用去理会底层实现。

HelloWorld详解

package main

import "fmt" // 导入一个系统包fmt用来输出的

func main() {
    fmt.Println("Hello World!") // 打印输出helloworld字符串!
}

package(创建包)

Go语言以“包”作为管理单位,每个 Go 源文件必须先声明它所属的包,所以我们会看到每个 Go 源文件的开头都是一个 package 声明,格式如下:

package name

其中 package 是声明包名的关键字,name 为包的名字。

Go语言的包与文件夹是一一对应的,它具有以下几点特性:

  • 一个目录下的同级文件属于同一个包。
  • 包名可以与其目录名不同。

main 包是Go语言程序的入口包,一个Go语言程序必须有且仅有一个 main 包。如果一个程序没有 main 包,那么编译时将会出错,无法生成可执行文件。

import(导入包)

在包声明之后,是 import 语句,用于导入程序中所依赖的包,导入的包名使用双引号""包围,格式如下:

import "name"

其中 import 是导入包的关键字,name 为所导入包的名字。

代码第三行导入了 fmt 包,这行代码会告诉 Go 编译器,我们需要用到 fmt 包中的函数或者变量等,fmt 包是Go语言标准库为我们提供的,用于格式化输入输出的内容(类似于C语言中的 stdio.h 头文件),类似的还有 os 包、io 包等。

另外有一点需要注意,导入的包中不能含有代码中没有使用到的包,否则Go编译器会报编译错误,例如 imported and not used: "xxx","xxx" 表示包名。

也可以使用一个 import 关键字导入多个包,此时需要用括号( )将包的名字包围起来,并且每个包名占用一行,也就是写成下面的样子:

import(
    "name1"
    "name2"
)

main函数

代码的第 5行创建了一个 main 函数,它是Go语言程序的入口函数,也即程序启动后运行的第一个函数。main 函数只能声明在 main 包中,不能声明在其他包中,并且,一个 main 包中也必须有且仅有一个 main 函数。 C/C++ 程序的入口函数也是 main(),一个 C/C++ 程序有且只能有一个 main() 函数。

main 函数是自定义函数的一种,在Go语言中,所有函数都以关键字 func 开头的,定义格式如下所示:

func 函数名 (参数列表) (返回值列表){
    函数体
}

格式说明如下:

  • 函数名:由字母、数字、下划线_组成,其中,函数名的第一个字母不能为数字,并且,在同一个包内,函数名称不能重名。
  • 参数列表:一个参数由参数变量和参数类型组成,例如 func foo( a int, b string )。
  • 返回值列表:可以是返回值类型列表,也可以是参数列表那样变量名与类型的组合,函数有返回值时,必须在函数体中使用 return 语句返回。
  • 函数体:能够被重复调用的代码片段。

注意:Go语言函数的左大括号{必须和函数名称在同一行,否则会报错。

打印 Hello World

代码的第 6 行 fmt.Println("Hello World!") 中,Println 是 fmt 包中的一个函数,它用来格式化输出数据,比如字符串、整数、小数等,类似于C语言中的 printf 函数。这里我们使用 Println 函数来打印字符串,也就是( )里面使用""包裹的部分。

注意,Println 函数打印完成后会自动换行,ln是 line 的缩写。

点号.是Go语言运算符的一种,这里表示调用 fmt 包中的 Println 函数。

另外,代码 fmt.Println("Hello World!") 的结尾,不需要使用;来作为结束符,Go 编译器会自动帮我们添加。

附录:几种常用的Print方式

Print

输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)
fmt.Print(str)

Println

输出到控制台并换行
fmt.Println(tmp)

Printf

需要使用占位符
a := 1
b := "hello Go!!!"
fmt.Printf("%d %s",a,b)

Printf中,有一些常用的格式化占位符,我们在这里列出一下:

占位符作用
%v以默认的方式打印变量的值
%T打印变量的类型
%s正常输出字符串
%t打印true或false
%p带0x的指针
%d整型
%#p不带0x的指针
%o不带零的八进制
%#o带零的八进制
%x小写的十六进制
%X大写的十六进制
%#x带0x的十六进制
%U打印Unicode字符
%#U打印带字符的Unicode
%b打印整型的二进制
%q字符串带双引号,字符串中的引号带转义符
%f(=%.6f) 6位小数点
%e(=%.6e) 6位小数点(科学计数法)
%g用最少的数字来表示
%.3g最多3位数字来表示
%.3f最多3位小数来表示

总结

Go语言未来可期,学好Go语言我们未来就业可以搞服务器编程网络编程开发云平台……