目录

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。