Go语言学习笔记

玩了两天Go语言记录一下笔记,万一以后用到方便查看

2021-8-17更新: 本文仅作尝试,记录一些用法,不做深入探究。

自己以前经常用Python,这次通过Go还是学习到了很多知识,比如反射,socket网络编程等。

Go玩完了,接下来打算认真学习一下Java,比较还是要吃饭的嘛!

估计我100年后可能需要Go,也许会回过头来,在看看这篇博客。

基础知识

1. 变量和常量定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var a1 int
var a2 int = 3
a3 := 3 // 更简洁的方法

// 常量A,B,C
const (
    A = iota + 1
    B
    C
)

Warning

如果定义变量不使用会编译器会拒绝编译

2. 导入和输出

1
2
3
4
5
6
import "fmt"
import (
    _ "fmt" // 匿名导入,可以不使用
)

fmt.Println("Hello World")

3. 数组和字典

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var a1 [3]int           // 数组
a2 := [3]int {1,2,3} 
a3 := []int {2,3,4}     // 动态数组

// 遍历数组
for index, value := range(a3) {
    fmt.Println("index = ",index," ;value = ",value)
}

// 切片
slice1 := make([]int,3,5)  // 大小为3,容量为5的数组

// 字典知识
var m1 map[string]int      // 声明字典
m1 = make(map[string]int)  // 分配空间
m1["one"] = 1

// 其他创建方式
m2 := make(map[string]int)
m3 := map[string] string {
    "one" : "1",
    "two" : "2",
}

4. 函数

1
2
3
4
5
6
7
fun add(x int) int{
    return x + 1
}

fun add_point(x *int) {
    *x = *x + 1
}

5. 结构体

 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
// 声明结构体
type Human struct {
    name string
    sex string
}

// 绑定方法 
// 方法名称: 大写为共有,小写为私有
// 绑定时:  有星为引用,无星为值传递
func (this *Human) Show() {
    fmt.Println("name = ",this.name)
    fmt.Println("sex = ",this.sex)
}

// 对象继承
type SuperMan struct {
    Human
    level int
}

h := Human{"zhangsan","male"}
h.Show()

s := SuperMan{Human{"li3","male"},88}
s.Show()

6. 接口

 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
27
/*
步骤:
    1. 有一个父类接口
    2. 实现了所有方法
    3. 指向子类
*/

// 动物类接口
type Animal interface {
    Sleep()
    GetColor() string
    GetType() string
}

// Cat 对象
type Cat struct {
    color string
}
func (this *Cat) Sleep() {
    fmt.Println("Cat is sleep")
}
func (this *Cat) GetColor() string{
    return this.color
}
func (this *Cat) GetType() string{
    return "Cat"
}

7. 反射简单类型

1
2
3
4
5
import "reflect"

var num2 int32 = 12
reflect.TypeOf(num2)
reflect.ValueOfnum2)

8. 并发

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// go 关键字+匿名函数 !当主程序结束会自动结束
go func() {
    ...
}()

// goroute之间进行通信
c := make(chan int)      // 不带缓冲的
c := make(chan int, 3)   // 缓冲为3

c <- 666    // 向信道发送(有阻塞特性)
num := <-c  // 从信道接受
close(c)    // 关闭信道

// 多信道选择,收到任意一个就执行
select {
case c <- x1:
    fmt.Println("x1")
case c <- x2:
    fmt.Println("x2")
}

9. 更换镜像

1
2
3
4
5
6
7
go env -w GO111MODULE=on

// 七牛云
go env -w GOPROXY=https://goproxy.cn,direct

// 阿里源
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

10. go module用法

1
2
go mod init gin
go get github.com/gin-gonic/gin

Q & A

1. go: github.com/XXXX: Get "XXXXXX": dial tcp 34.64.4.17:443: i/o timeout问题

回答:更换一个镜像源即可,可以执行go env -w GOPROXY=https://goproxy.cn命令

2. go get 无法下载 golang.org/x 下的包怎么办?

回答:只能手动下载啦,步骤如下

  1. 在gopath下的src目录下新建目录golang.org/x
  2. 在src/golang.org/x目录下打开cmd
  3. 执行命令git clone https://github.com/golang/xxx.git, xxx是你要下载的包名。比如要下载golang.org/x/text包,那么就执行git clone https://github.com/golang/text.git

3. Windows环境golang程序开发 报错exec: gcc: executable file not found in %PATH%

回答:出现了这个问题说明,我们缺少了GCC编译器,需要重新下载,然后加入环境变量即可,我最开始参考的这个文档,但是建议选择比较高一点的版本,我开始安装的版本比较低,又报了这个错误unrecognized option '--high-entropy-va'后来安装了MingW8.1,成功解决问题。

相关学习视频

Thecw第一集

Thecw第二集

8小时讲解

参考文献

  1. go get拉取太慢
  2. golang第三方包的引用报错
  3. [无法下载 golang.org/x的包]https://blog.csdn.net/puss0/article/details/89890573
updatedupdated2022-07-112022-07-11