这是我参与「第五届青训营」伴学笔记创作活动的第 10 天
前言
本文主要内容是对Go语言的相关基础知识进行查缺补漏!!
- Go的命名
- Go的os包
- Go的导包知识
- Go的关键字type的知识
1 Go的命名
- 尽量使用短小的名字
- 使用 驼峰式 命名,即“当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔”
- 不要用下面展示的关键字和预定义名进行变量或常量的命名
Go的关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Go的预定义名
-
内建常量:true false iota nil
-
内建类型:
int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error
-
内建函数:
make len cap new append
copy close delete complex real imag panic recover
2 Go的os包
-
os包以跨平台的方式,提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os包的Args变量获取,os包外部使用os.Args访问该变量
-
os.Args变量是一个字符串(string)的切片(slice),切片是Go语言的基础概念。现在先把切片s当作数组元素序列,序列的长度动态变化,用
s[i]访问单个元素,用s[m:n]获取子序列。序列的元素数目为len(s)。- 大多数编程语言类似,区间索引时,采用左闭右开形式,即,区间包括第一个索引元素,不包括最后一个,因为这样可以简化逻辑。如s[m:n]这个切片,0 ≤ m ≤ n ≤ len(s),包含n-m个元素。
- os.Args的第一个元素:os.Args[0],是命令本身的名字,其它的元素则是程序启动时传给它的参数。
- 系统启动时传给它的参数的获取可以简写成os.Args[1:] ,其中对于s[m:n],会默认传入0或len(s)。
3 Go的导包
Go语言的代码通过包(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个.go源代码文件组成,目录定义包的作用。每个源文件都以一条package声明语句开始,如package main,表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。
main包
- main包比较特殊,它定义了一个独立可执行的程序,而不是一个库。
- 在
main里的main函数 也很特殊,它是整个程序执行时的入口(译注:C系语言差不多都这样)。 main函数所做的事情就是程序做的。main函数一般调用其它包里的函数完成很多工作(例如:fmt.Println)。
导包的一些技巧
- 导入的包之间可以通过添加空行来分组
- 如果某个值不被使用,可以将其分配给blank identifier(即下划线__)
包的初始化
包的初始化首先是解决包级变量的依赖顺序,然后按照包级变量声明出现的顺序依次初始化:
var a = b + c // a 第三个初始化, 为 3
var b = f() // b 第二个初始化, 为 2, 通过调用 f (依赖c)
var c = 1 // c 第一个初始化, 为 1
func f() int { return c + 1 }
-
如果包中含有多个.go源文件,它们将按照发给编译器的顺序进行初始化,Go语言的构建工具首先会将.go文件根据文件名排序,然后依次调用编译器编译。
-
对于在包级别声明的变量,如果有初始化表达式则用表达式初始化,还有一些没有初始化表达式的,例如某些表格数据初始化并不是一个简单的赋值过程。在这种情况下,我们可以用一个特殊的init初始化函数来简化初始化工作。每个文件都可以包含多个init初始化函数
func init() { /* ... */ }
这样的init初始化函数除了不能被调用或引用外,其他行为和普通函数类似。在每个文件中的init初始化函数,在程序开始执行时按照它们声明的顺序被自动调用。
4 Go的关键字type
Golang语言中存在一个关键字type
两种使用方式
- 类型别名
- 类型定义
是不是很像C语言中define和typedef
类型定义
类型定义是完全定义了一种新的类型。
type Student struct {
name String
age int
email String
}
type I int
类型别名
类型别名只是给现有的类型取了一个别名alias。
type Sdt = Student
type I = int
两者区别展示说明
例子1:
type I int //类似于C语言中的typedef
type D = int //类似于C语言中的#define
例子2:
type Student struct {
name String
age int
email String
}
type Teacher Student
从例子2来看,相当于定义了一个新的Teacher类型,和下面的代码是等价的。虽然两个类型内存布局完全一样,但是从概念上来说,它们是完全不同的两个类型,不能相互兼容。
type Teacher struct {
name String
age int
email String
}
小技巧
类型别名这个功能非常有用,鉴于go中有些类型写起来非常繁琐,比如json相关的操作中,经常用到map[string]interface {}这种类型,要写完全部很麻烦,可以给它起个简单的别名,通过这个方式进行使用就方便多了。
type strMap2Any = map[string]interface {}
心得
今天对于Go的相关基础知识进行了复习和一些不懂的相关问题的调查,因此根据学习知识从四个方面写下了本文,分别为Go的命名,Go的os包,Go的导包知识,Go的关键字type的知识,经过今天的再次温习Go语言,我感觉到自己对go语言的学习更进一步,获益匪浅,希望之后也能加油学习!
引用
ppt:Go 语言上手 - 基础语法 .pptx - 飞书云文档 (feishu.cn)