go语言基础学习(3)
目录
配置了 Ubuntu 相关编程环境,学习 Go 语言基础内容,主要是跟着官方教程走一遍,对比 C++的一些不同点学习。
一.Go 语言变量、函数
1.变量的初始化
- 可以通过
var a int
或者采用a:=3
省略变量的类型,Go 语言会自动推导变量的类型。
2.Go 语言的基本类型
- 多了一个 rune 类型,教程里没有仔细介绍,也很少使用,之后再注意。
3.类型转换
- Go 语言中不同类型的项之间需要显示转换,没有隐式类型转换。
4.函数有多返回值
二.Go 语言中的流程控制
1.Go 语言中的循环只有 for
- 所有的循环都采用 for 来实现,for 的使用与 C++类似,但是 for 后面不需要小括号,一定需要大括号。
- 可以在 for 循环中定义变量,但作用于只在 for 循环中。
- 需要注意的是,Go 语言只有后置++,没有前置++。
- 另外,for 语句中可以有空项,但是分号要写上。
- 当 for 用来写 while 循环时,可以直接采用
for i<100{}
,不需要写上全部分号。
2.if 语句
- if 语句表达式外不需要小括号,但是一定需要大括号,这点与 for 语句的使用是类似的。
- 可以在 if 语句中执行一个简单的语句,分号隔开后再加判断语句。
- 同样,else 后面也需要大括号
3.switch 语句
- Go 语言的 switch 中的 case 可以不是常量,也可以不是整数。
- Switch 中的 case 语句,自带 break,不需要再写 break。
4.defer 语句
- defer 语句会推迟到外层函数执行结束后执行。
- defer 语句会压栈,当有多个 defer 语句时,后面的 defer 语句会先执行。
三.slice
- 切片就像数组的引用,改变切片会改变底层的值
- 切片的默认行为,可以不写完整的上下限,切片默认有上下限
- 只是截取切片是不会改变切片大小的
- 切片的长度就是它所包含的元素个数,容量是从它的第一个元素开始数,到其底层数组元素末尾的个数
- 切片的零值是
nil
四.主要问题记录
1. fmt.Println()函数中的执行顺序问题
当 Println()中打印多个函数的执行结果时,Println()会先顺序调用每个函数,将其结果保存,之后再顺序打印。例子如下:
package main
import "fmt"
func add(x,y int) int{
sum:=x+y
fmt.Println(sum)
return sum
}
func main(){
fmt.Println(add(1,2),add(2,3))
}
执行结果为:
3
5
3 5
2.切片的容量扩展问题
类似于 C++中的 vector,切片的容量扩展,大部分时候也是采用 2 倍扩展,但是也有稍许的差别,在学习过程中无意发现,查看源码可以看到 append 的实现。就 int 而言,当元素个数小于 20 时,当 slice 的容量不够时,继续 append 会将 cap+1,超过 20 后才会 cap*2。