最近面试成功了腾讯教育子公司。以后得从事Go语言开发相关工作啦,特此在这记录下Go基础学习。
参考链接: https://tour.go-zh.org/
Go关键字
break default func interface select(选择不同类型的通讯)
case defer go map(引用类型,字典) struct
chan else goto package switch
const(常量) fallthrough if range(用于读取slice、map、channel数据) type(声明自定义类型)
continue for import return var(变量)
- 大写字母开头的变量是可导出的,也就是其它包可以读取的,是公有变量;小写字母开头的就是不可导出的,是私有变量。
- 大写字母开头的函数也是一样,相当于class中的带public关键词的公有函数;小写字母开头的就是有private关键词的私有函数。
make & new
- new用于各种类型的内存分配。[new分配返回的是指针,即类型*T]
new返回指针。 (它返回了一个指针,指向新分配的类型T的零值。)
new(T) 为类型T分配一片内存,初始化为0并且返回类型为*T的内存地址,适用于任意类型。对于结构体,new(T)相当于&T{}。
- make用于内建类型(map、slice 和channel)的内存分配。[make返回引用,即T]
make返回初始化后的(非零)值。 (指向数据结构的引用在使用前必须被初始化。)
make(T) 也是用于内存分配的,但是和new不同,它只适用于3种内建的引用类型:切片、map和channel,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。
// 为切片结构分配内存;p为指向切片的指针;*p == nil;很少使用。
var p *[]int = new([]int)
// 切片v现在是对一个新的有10个整数的数组的引用。
var v []int = make([]int, 10)
// 不必要地使问题复杂化:
var p *[]int = new([]int)
fmt.Println(p) // 输出:&[]
*p = make([]int, 10, 10)
fmt.Println(p) // 输出:&[0 0 0 0 0 0 0 0 0 0]
fmt.Println((*p)[2]) // 输出:0
// 习惯用法:
v := make([]int, 10)
fmt.Println(v) // 输出:[0 0 0 0 0 0 0 0 0 0]
包、变量、和函数
包 (package main)
每个 Go 程序都是由包构成的。
程序从 main 包开始运行。
在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的。
package (在我们的例子中是package main)这一行告诉我们当前文件属于哪个包,而包名main则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了main包之外,其它的包最后都会生成*.a文件(也就是包文件)并放置在 G O P A T H / p k g / GOPATH/pkg/ GOPATH/pkg/GOOS_$GOARCH中
函数
- 函数可以返回任意数量的返回值。
- 当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。
- 没有参数的 return 语句返回已命名的返回值。也就是 直接 返回。
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}
变量 (var)
- var 语句用于声明一个变量列表,跟函数的参数列表一样,类型在最后。
- 如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型。
- 在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。
func main() {
var i, j int = 1, 2
k := 3
c, python, java := true, false, "no!"
fmt.Println(i, j, k, c, python, java)
}
基本类型
int, uint 和 uintptr 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽。 当你需要一个整数值时应使用 int 类型,除非你有特殊的理由使用固定大小或无符号的整数类型。
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 表示一个 Unicode 码点
float32 float64
complex64 complex128
类型转换
- 表达式 T(v) 将值 v 转换为类型 T。
i := 42
f := float64(i)
u := uint(f)
类型推导
- 在声明一个变量而不指定其类型时(即使用不带类型的 := 语法或 var = 表达式语法),变量的类型由右值推导得出。
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
常量 (const)
- 常量可以是字符、字符串、布尔值或数值。
常量不能用 := 语法声明。
流程控制语句 for if/else switch defer
Go中流程控制分三大类:条件判断,循环控制和无条件跳转。
goto
用goto跳转到必须在当前函数内定义的标签。
func myFunc() {
i := 0
Here: //这行的第一个词,以冒号结束作为标签
println(i)
i++
goto Here //跳转到Here去
}
循环语句:for
它既可以用来循环读取数据,又可以当作while来控制逻辑,还能迭代操作。
sum := 0