go
下载安装包
https://golang.google.cn/dl/
环境搭建
- windows环境搭建
https://blog.csdn.net/youshijian99/article/details/81782875
交叉编译
参考1:https://www.cnblogs.com/zsy/p/12008141.html
参考2:https://www.cnblogs.com/shiluoliming/p/9648348.html
常见问题
- go.mod file not found
go env -w GO111MODULE=auto
参考:https://www.jianshu.com/p/7614b7a421a4
- 解决goland错误:package ***is not in GOROOT
解决步骤:
第一步,在项目的当前目录里,执行命令:go mod init ,会在当前项目目录下自动创建go.mod文件。
第二步,在命令行下,进入当前项目目录,执行命令:go run main.exe,此时会自动下载和关联该项目用到的包。
参考:https://www.cnblogs.com/bluesky0122/p/14208780.html
- go get 下载慢
set GOPROXY=https://goproxy.cn
set GO111MODULE=on
参考:https://www.cnblogs.com/xuweiqiang/p/12024178.html
golang游戏框架
- Pitaya https://cloud.tencent.com/developer/article/1704645
- nano: https://github.com/lonng/nano
install base package
ms sqlserver
- github:https://github.com/denisenkom/go-mssqldb
- help demo1:https://www.cnblogs.com/songxingzhu/p/5849148.html
- help demo2: https://blog.csdn.net/weixin_42780662/article/details/84551572?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
package cannot download
http层面增加代理
添加如下环境变量,来解决https fetch failed问题
$ export http_proxy=socks5://127.0.0.1:1080 // 梯子的本地端口
$ export https_proxy=$http_proxy
go get层面增加代理
go 1.11版本新增了 GOPROXY 环境变量,go get会根据这个环境变量来决定去哪里取引入库的代码
$ export GOPROXY=https://goproxy.io
其中,https://goproxy.io 是一个goproxy.io这个开源项目提供的公开代理服务。
- url:https://blog.csdn.net/snowin1994/article/details/88358836?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
go package
- go frame go基础开发框架:https://gitee.com/johng/gf/tree/master
- goproxy 代理:https://gitee.com/snail/proxy
- hfish 蜜罐:https://gitee.com/lauix/HFish
- gopub 分布式运维:https://gitee.com/dev-ops/gopub
- go-fastdfs 分布式下载:https://gitee.com/sjqzhang/go-fastdfs
- gogs git托管平台:https://gitee.com/Unknown/gogs
- httprouter http 路由:https://github.com/julienschmidt/httprouter
go vscode setting
参考url:
https://www.cnblogs.com/yangxiaoyi/p/9692369.html
vim配置go语言开发环境
安装插件
Plug 'fatih/vim-go'
Plug 'buoto/gotests-vim'
8小时专职Golang工程师学习笔记
这个课程是2021年的课程,有些知识点不一定符合最新的Golang。
- 课程地址: https://www.bilibili.com/video/BV1gf4y1r79E?p=3&vd_source=5cbf24b674b5b4183e6f626cd037b179
P1 课程须知与课程提纲
P2 Golang开发环境重点和IDE选型推荐
P3 当下的Golang分析
Golang的优势
语言层面的并发:使用go
关键字即可
package main
import (
"fmt"
"time"
)
func goFunc(i int) {
fmt.Println("goroutine",i, " ...")
}
func main(){
for i := 0; i < 10000; i++ {
go goFunc(i) //开启一个并发协程
}
time.Sleep(time.Second)
}
充分的利用多核
强大的标准库
- runtime系统调度机制
- 高效的GC垃圾回收
- 丰富的标准库
简单易学
- 25个关键字
- C语言简洁基因,内嵌C语法支持
- 面向对象特征(继承、多态、封装)
- 跨平台
- 大厂领军
- tencent
- baidu
- 京东
- 小米
- 七牛
- 滴滴
- 阿里巴巴
- 字节跳动
- bilibili
- sina
- 美团
特性展现
fibonacci斐波那契数列算法
go version && time go build fibonacci.go && time ./fibonacci
p4 从一个main函数初见Golang语法点
package main
import "fmt"
func main {
fmt.Println("hello Golang!")
}
知识点
- 左括号要在行尾部
- 行末可以加分号,建议不加
- 导入包的2中写法
import "fmt"
import "time"
// 或
import (
"fmt"
"time"
)
P5 常见的4种声明方式与多变量声明
方法1:声明一个变量,默认值是0
var a int
方法2:声明一个变量,初始化一个值
var b int = 100
var bb string = "test"
方法3:在初始化的时候可以省去数据类型,通过值自动匹配当前变量的数据类型。
var c = 200
var cc = "test cc"
方法4: 省去var关键字,直接自动匹配(常用方法)
- 这种方法只能使用在函数体内。
d := 300
dd := "test dd"
声明多个变量
var a,b,c int = 1,2,3
var a,bb,c = 1,"test bb",3
多行的多变量声明
var (
ee int = 100
ff bool = true
)
P6 const与itoa知识点注意事项
- 常量是不运行修改的,编译无法通过。
- 可以在const()添加一个关键字iota, 每行的iota都会累加1,第一行的iota默认值为0
const (
BEIJING = iota
SHANGHAI
GUANGZHOU
)
P7 Golang中的多返回值的3种写法
第1种方式
func add(a int,b int)(int,int,int) {
c: = a + b
return c,a,b
}
第2种方式
- c1,c2,c3默认值为0
func add(a int,b int)(int c1,int c2,int c3) {
c1 = a + b
c2 = a + b
c3 = a + b
return
}
第3种方式
func add(a int,b int)(c1,c2,c3 int) {
c1 = a + b
c2 = a + b
c3 = a + b
return
}
P8 import导包路径问题与init方法调用流程
- import时会调用包内的init()
- import时需要导入GOPATH下当前包的路径
- import匿名导入不调用的包,只调用包里的init方法
P9 import匿名及别名导包方式
import (
_ "mylib1"
)
- import 别名导入包
import (
mylib1 "lib1"
)
- import 导入包使用.(不推荐,容易引起歧义)
import (
_ "mylib1"
)
P10 Golang中的指针速通
- Golang中的指针一般是一级或二级的很少有三级或四级。
func changeValue(p *int) {
*p = 10
}
P11 defer语句的调用顺序
- defer是函数生命周期结束后才调用。
- 先写的defer先入栈,先进后出。
P12 Golang中的数组与动态数组区别
- 数组传递是进行值的copy传递
- 动态数组,切片,引用传递
P13 slice切片的4种声明定义方式
方式1
slice1 := []int{1,2,3,4}
方式2
// 声明但是没有分配空间
var slice1 := []int
// 开辟3个空间,默认值为0
slice1 = make([]int,3)
方式3
var slice1 []int = make([]int,3)
方式4
slice1 := make([]int,3)
判断一个slice是否为0
if slice1 == nil {
fmt.println("slice1 is nil")
}
p14-slice的追加和截取
- len:长度
- cap:容量
// len=3,cap=5
var numbers = make([[int,3,5)
// len =4,cap=5
numbers = append(numbers,1)
// len =5,cap=5
numbers = append(numbers,2)
// cap满的时候再append会追加一个之前的cap大小的容量
//截取是引用关系
s2 := make([]int,3)
// 将numbers中的值copy到s2中
copy(s2,numbers)
p15-map的三种声明方式。
方式1
var map1 map[string]string
if map1 == nil {
fmt.Println("map1 is nil")
}
map1 = make(map[string]string,10)
map1["one"] = "go"
map1["two"] = "rust"
map1["threee"] = "c"
方式2
map2 := make(map[string]string)
map2["one"] = "go"
map2["two"] = "rust"
map2["threee"] = "c"
方式3
map3 := map[string]string {
"one" : "go",
"two" : "rust",
"threee" : "c",
}
p16-map的使用
添加
map1["four"] = "c++"
删除
delete(map1,"one")
修改
map1["four"] = "cpp"
遍历
func printMap(myMap map[string]string){
for k,v := range myMap {
fmt.Println("key:",k,"v:",v)
}
}
p17-结构体
type定义结构体
type Book struct {
name string
auth string
}
p18-Golang中面向对象类的表示与封装
- 如果类的属性首字母大写,表示该属性对外能够访问的,否则的话只能够内部访问。
p19-Golang中面向对象的继承
p20-Golang中面向对象的多态
- interface
基本要素
- 有一个父类(有接口)
- 子类实现了父类的所有接口
- 父类型的变量指向子类的具体数据变量
p21-interface空接口万能类型与类型断言机制
通用万能类型:interface{} 空接口
int、string、float32、float64、struct...都实现了interface
类型断言
p22-变量的内置pair结构详细说明
- 变量包含type和value两部分
p23-golang反射reflect机制用法
根据变量能够知道它的类型
- ValueOf
- TypeOf
p24-golang反射解析结构体标签Tag
p25-结构体标签在json中的应用
json库: encoding/json
jsonStr,err := json.Marshal(movie)
p26-goroutine基本模型和调度策略
单进程时代的2个问题
- 时间片
- cpu浪费
多线程/多进程操作系统
- 进程/线程的数量越多,切换成本就越大,也就越浪费
- 开发设计复杂
- 进程占用虚拟内存4GB左右(32bitOS)
- 线程占用内存4MB左右
- 一个线程:用户空间和内核空间
goroutine
- 解决线程切换带来的cpu消耗
- 协程调度器
- N线程-->M协程
- co-rountine-->goroutine
- GMP:goroutine,processor处理器,thread线程
goroutine调度器的设计策略
- 复用线程
- 利用并行
- 抢占
- 全局G队列
p27-创建goroutine
创建
go newTask()
退出goroutine
- 退出 goroutine
runtime.Goexit()
p28-channel的基本定义与使用
- channel起到了goroutine之间的同步的作用。
p29-channel有缓冲无缓冲同步问题
- 创建有缓冲的channel,当channel已满,再写入数据会阻塞,当channel已空,再取数据会阻塞。
c:= make(chan,int,3)
p30-channel的关闭特点
- 关闭channel
close(c)
- 对于nil channel,无论收发都会被阻塞
- 关闭channel后,可以继续从channel接受数据
- 关闭channel后,无法向channel再发送数据(引发panic错误后导致接收立即返回0值)
p31-channel与range
c := make(chan int)
for data := range c {
fmt.Println(data)
}
p32-channel与select
select具备多路channel的状态监控的功能。
p33-GOPATH工作模式的弊端
GOPATH的弊端
- 没有版本控制的概念
- 无法同步一致第三方版本号
- 无法指定当前项目引用的第三方版本号
go modules
- 解决了go语言的依赖管理问题
p34-GoModules基础环境说明
go mod help
go mod init
- 设置GO111MODULE的值,建议go1.11之后的版本都设置为on
go env -w GO111MODULE=on
- 设置GOPROXY,建议国内七牛云,阿里云
go env -w GOPROXY=https://goproxy.cn,direct
- GOPRIVATE
p35-GoModules初始化项目
bo mod init demo1
go.sum文件记录依赖的模块版本,保证今后项目依赖的版本不会被篡改。
p36-改变模块依赖关系
- replace用法
go mod edit -replace
p37-及时通信系统-介绍
- OnlineMap:user.Name uesr
- channel
- handler go:read
- user:wirte -->client