这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
前言
青训营的学习也已经快接近尾声了,今天总结一下Go语言的基础语法知识,回顾一下这一个月学习到的基础
Go语言简介
Go语言简介
Go 语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++等编译型语言的性能与安全性”
Go 语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go 语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。
Go 语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势,目前国内诸多 IT 公司均已采用 Go 语言开发项目。
Go 语言有时候被描述为“C 类似语言”,或者是“21 世纪的 C 语言”。Go 从 C 语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有 C 语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。
因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说 Go 语言是一门混合型的语言。
此外,很多重要的开源项目都是使用 Go 语言开发的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。
Go语言的优势
- 语法简单
- 可以直接编译成机器码
- 静态数据类型和编译语言
- 内置垃圾回收
- 部署简单
- 强大的标准库
Go是编译型语言
Go 使用编译器来编译代码。编译器将源代码编译成二进制(或字节码)格式;在编译代码时,编译器检查错误、优化性能并输出可在不同平台上运行的二进制文件。要创建并运行 Go 程序,程序员必须执行如下步骤。
使用文本编辑器创建 Go 程序;
保存文件;
编译程序;
运行编译得到的可执行文件。
Go语言基础语法
包
每个 Go 程序都是由包构成的。 对于导入的包:
- 编译器会首先在GOROOT中寻找
- 随后会在项目所对应的GOPATH中寻找
- 最后才是在全局GOPATH中寻找
- 如果都无法找到,编译器将会报错
程序从 main 包开始运行。包名与导入路径的最后一个元素一致,通过import来导入包
"fmt"
也可以通过圆括号组合导入:
"fmt"
"math"
)
导出名
在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的。在导入一个包时,只能引用其中已导出的名字。任何“未导出”的名字在该包外均无法访问。
函数
函数可以没有参数或接受多个参数。
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println(add(1,2))
}
函数可以返回任意数量的返回值。
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
变量和常量
变量的声明很像 javascript,使用 var关键字。
var count int
count := 0
常量很简单,使用const关键字:
const string = "hello world"
流程控制
- for
for相对于Java,区别仅在于for后面的部分不需要小括号
go语言只有for循环,用for代替java的while\ - if
f后面的表达式也不需要小括号
if语句的表达式之前,可以有一个简单的语句,例如变量初始化\
结构体
结构体只能比较是否相等,不能比较大小 相同类型的结构体才能比较,结构体是否相同,不但与属性类型有关,还与属性的顺序有关 如果所有结构体成员都可以比较,则根据属性顺序逐个比较,如果每一项都相等,那么这两个结构体相等 可比较的类型包括bool、数值型、字符、指针、数组等 map、切片、函数是不能比较的
切片
切片格式 var identifier []type
切片初始化格式 var slice []type = arr1[start:end]
切片是一个长度可变的数组
一个数组的切片和这个数组的其他切片是共享存储的
切片是引用,不需要额外的内存,比数组更有效率
字符串
字符串是一种值类型,且值不可变。可以理解是一个定长的字节数组
字符串创建后,不能修改
map
go语言中,map的创建必须采用make函数,不像java采用new。如果不用make,也可以在声明同时,用构造的形式
如果只声明map类型,直接使用map会报错
map中的key是无序的