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

  1. go frame go基础开发框架:https://gitee.com/johng/gf/tree/master
  2. goproxy 代理:https://gitee.com/snail/proxy
  3. hfish 蜜罐:https://gitee.com/lauix/HFish
  4. gopub 分布式运维:https://gitee.com/dev-ops/gopub
  5. go-fastdfs 分布式下载:https://gitee.com/sjqzhang/go-fastdfs
  6. gogs git托管平台:https://gitee.com/Unknown/gogs
  7. 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语法支持
  • 面向对象特征(继承、多态、封装)
  • 跨平台
  • 大厂领军
    • google
    • facebook
    • 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

p38-及时通信系统- v0.1基础server构建

p39-及时通信系统- v0.2用户上线及广播功能

p40-及时通信系统- v0.3用户消息广播