2019.7.2 日报 余国聪

配置了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()会先顺序调用每个函数,将其结果保存,之后再顺序打印。例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
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))
}

执行结果为:

1
2
3
3
5
3 5

2.切片的容量扩展问题

类似于C++中的vector,切片的容量扩展,大部分时候也是采用2倍扩展,但是也有稍许的差别,在学习过程中无意发现,查看源码可以看到append的实现。就int而言,当元素个数小于20时,当slice的容量不够时,继续append会将cap+1,超过20后才会cap*2。