[学习笔记]go learning

  1. 1. go learning

go learning


go语言的学习qwq

记得很早之前我写过一篇,不过这次算是比较系统的学习

go果然对cpp程序员比较友好啊

首先解析一个程序的基本结构

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("kririae")
}

这是一个基本的go程序

第一行package main大概是名称空间的意思

是每一个可执行程序的开头

import fmt则是import了一个包,”format”

ccstdio大概是一个意思

顺带说一句,go支持内嵌c语言…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import "fmt"

/*
int add(int a, int b) {
return a + b
}
*/
import "C"

func main() {
fmt.Println(add(1, 2))
}

下一步,变量申明

go的变量声明有两种

局部变量多数时候用a := 1

绝非动态语言,go只是帮忙推断类型

全局变量应该是这样的

var a int = 1

类型和c差不多。

声明数组用

var a [5]int

声明了一个大小为5的数组

var a []int 声明了一个大小未知的动态数组

这段语句也可以这么些

a := make([]int, 5)

有一个很玄学的第三个啊承诺书

a := make([]int, 5, 10)

类比到cpp cpp的vector为了防止加入内容缓慢而减速,设置了cap

cap的意义是“留存一些空间便于下一次分配的时候使用”

那么第三个参数到底是啥意思…

append(a, 233, 233, 233, 233, 233, 233)

你会发现,现在的cap(a)变成了20。那大概就是每一次分配的空间数了

slice(之前在数组之后介绍的)还zici切片

fmt.Println(slice[2:5]),切片qwq

发现一个难点

go语言的返回值

1
2
3
4
5
6
func ret() (re int) {
r func() {
re++
}
return 0;
}

如果没有看错,得到的是1

干了这样一件事情qwq

首先,给re分配了一个空间,作为返回值。

然后,把0给了ret…

再然后++re

然后返回

1
2
3
4
5
6
7
func f() (result int) {
defer func() {
fmt.Println(result)
result++
}()
return 2333
}

比如说这个函数

调用后的结果是2333

简析一下interface类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
"fmt"
"math"
)

type Abser interface {
Abs() float64 // 定义了一个Abser的interface类型
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}

func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
a = f
fmt.Println(a.Abs())
}

(这是一段粘来的代码

8..10行定义了一个Abser的interface。