基本数据类型

  • 变量的声明:常量(const) 变量(var) 类型(type)
  • 类型转换:需要显式的强制类型转换(不同于 C,表现为强类型语言)
1
var m float64 = float64(i)
  • String:和 C/C++ 不一样,Go 中的字符串是根据长度限定,而非特殊字符 \0
  • 自增/自减运算符:++ 和 – 的只能作为语句,而非表达式 (不同与 C!)
1
2
//错误示例
val = arr[i++]

控制结构

1. if-else

  • Go 看起来不使用分号作为语句的结束,但实际上这一过程是由编译器自动完成

2. switch

  • switch 从上往下执行 case 语句直到匹配成功
  • 多重条件判断使用 switch true{case: … case: …}形式

3. for

  • Go 中的循环体只有 for 一种
  • for 后直接加上条件判断成为 C 中的 while
1
2
3
4
for index < 8{
//循环
index++
}
  • for-range 遍历
1
2
3
4
5
6
7
8
for index , value := range slice1{
//循环
}

//空白标识符 _ 也被用于抛弃值
for _, val := range map1{
//循环
}

defer

  • defer 语句会将函数推迟到外层函数返回之后执行

数据结构

1.数组(Array)

  • sort 包:标准库提供了 sort 包来实现常见的搜索排序操作
    如:func Ints(a [ ]int) 、func Strings(a [ ]string)
  • 想要在数组或切片中搜索一个元素,该数组或切片必须先被排序(因为标准库的搜索算法使用的是二分法)。然后,使用函数 func SearchInts(a [ ]int, n int) int 进行搜索,并返回对应结果的索引值
1
2
sort.Ints(arr)
index := sort.SearchInts(arr, 31)

2. 切片(Slice)

  • 切片和数组的区别:切片和数组区别
  • new ( ) 和 make ( ) 的区别:new和make区别

3. 图(Map)

  • 切片和图都是引用类型:内存都可以用 make 方法来分配

    不要使用 new,永远用 make 来构造 map

  • delete( )函数用于删除 map 中的元素

包(Package)

  • 包和库函数:包更倾向于提供一种组织和管理代码的机制(?),而库函数更专注于提供特定功能的可重用代码。(GPT)
  • container 包:heap、list、ring
  • sort 包:排序
  • sync 包

结构

  • 结构体定义:
1
2
3
4
5
type identifier struct {
field1 type1
field2 type2
...
}
  • 使用  new  函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针var m *T = new(T)
    使用new初始化
  • 声明  var m T  也会给  m  分配内存,并零值化内存,但是这个时候  m  是类型 T
  • 内嵌结构体实现“继承”机制: Go 入门指南 10.5.2

函数(Function)

  • 函数也是一种类型,可以赋值给变量
1
2
thread := function
m := thread()
  • 函数可以作为参数传递给函数
  • 函数可以作为函数的返回值
  • 匿名函数
    • 立即执行函数:创建一个独立的作用域,避免变量污染或者命名冲突
1
2
3
4
5
6
7
8
9
10
func main() {
func() {
fmt.Println("Hello world!")
}()

var m = 1
sensor := func() int{
return m
}
}
  • 闭包(Closure)
    性质: 1. 函数嵌套函数 2. 函数内部可以引用外部的参数和变量(capture 捕获) 3. 参数和变量不会被 F 垃圾回收机制回收
    示例:Go by Example: Closures)

    This function value captures its own i value

方法(Method)

  • 方法是一种特殊类型的函数
  • 类型+方法=面向对象中的类
  • 方法定义:
    • 类型和作用在它上面定义的方法必须在同一个包里定义
1
func (recv receiver_type) methodName(parameter_list)(return_value_list{ ... }
  • 方法调用:object.name (object 为实例,name 为方法)
  • 函数和方法的区别
    • 函数将变量作为参数:Function1(recv)
    • 方法在变量上被调用:recv.Method1()