文章目录
楔子
go简单学习笔记
学习参考资料
https://learnku.com/go/wikis/38440
go入门指南电子书
Go国内加速镜像
几个镜像
- 全球CDN加速 官方
https://goproxy.io/
- 七牛
https://goproxy.cn
- 阿里
https://mirrors.aliyun.com/goproxy/
Windows
文档上说这是Linux的设置方法,但是我使用Windows也设置成功了
# 启用 Go Modules 功能
go env -w GO111MODULE=on
# 配置 GOPROXY 环境变量,以下三选一
# 1. 官方
go env -w GOPROXY=https://goproxy.io
# 2. 七牛 CDN
go env -w GOPROXY=https://goproxy.cn,direct
# 3. 阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/
----------以下内容在powershell上进行-------------------------------
# 启用 Go Modules 功能
$env:GO111MODULE="on"
# 配置 GOPROXY 环境变量,
# 1. 阿里云
$env:GOPROXY="https://mirrors.aliyun.com/goproxy/"
# 2. 官方
$env:GOPROXY="https://goproxy.io"
Go Modules基本使用
命令 | 作用 |
---|---|
go mod init | 生成 go.mod 文件 |
go mod download | 下载 go.mod 文件中指明的所有依赖 |
go mod tidy | 整理现有的依赖 |
go mod graph | 查看现有的依赖结构 |
go mod edit | 编辑 go.mod 文件 |
go mod vendor | 导出项目所有的依赖到vendor目录 |
go mod verify | 校验一个模块是否被篡改过 |
go mod why | 查看为什么需要依赖某模块 |
GO111MODULE
Go语言提供了 GO111MODULE 这个环境变量来作为 Go modules 的开关,其允许设置以下参数:
- auto:只要项目包含了 go.mod 文件的话启用 Go modules,目前在 Go1.11 至 Go1.14 中仍然是默认值。
- on:启用 Go modules,推荐设置,将会是未来版本中的默认值。
- off:禁用 Go modules,不推荐设置。
GOPROXY
这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时能够脱离传统的 VCS 方式,直接通过镜像站点来快速拉取。
GOPROXY 的默认值是:https://proxy.golang.org,direct,这有一个很严重的问题,就是 proxy.golang.org 在国内是无法访问的,因此这会直接卡住你的第一步,所以你必须在开启 Go modules 的时,同时设置国内的 Go 模块代理,执行如下命令:
$ go env -w GOPROXY=https://goproxy.cn,direct
GOPROXY 的值是一个以英文逗号 “,” 分割的 Go 模块代理列表,允许设置多个模块代理,假设你不想使用,也可以将其设置为 “off” ,这将会禁止 Go 在后续操作中使用任何 Go 模块代理。
邮件
发送(带附件和内嵌图片)
内嵌图片如下
package main
import (
"gopkg.in/gomail.v2"
)
func main() {
m := gomail.NewMessage()
//发送者
m.SetHeader("From", "#####@163.com")
//接受者
m.SetHeader("To", "#######@163.com")
//m.SetAddressHeader("Cc", "dan@example.com", "Dan")
//邮件主题
m.SetHeader("Subject", "开会!zhu")
//作为内嵌图片发送|注意下面这两行代码的 图片名字,一个被重命名了,将作为内嵌图片发送
m.Embed("D:\\pic\\ps\\166174\\31c03.jpg", gomail.Rename("image.jpg"))
m.Embed("D:/pic/ps/105724/16a01.jpg")
m.SetBody("text/html", `
<img src="cid:image.jpg" alt="My image" width="100" height="200"/>
<img src="cid:16a01.jpg" alt="My image" width="100" height="200"/>`)//内嵌图片使用 cid:图片名
//普通附件
m.Attach("D:\\pic\\ps\\166174\\31c02.jpg", gomail.Rename("picture.jpg"))
m.Attach("D:\\pic\\ps\\166174\\31c04.jpg")
//163邮箱是 授权码
d := gomail.NewDialer("smtp.163.com", 25, "######@163.com", "######")
// Send the email to Bob, Cora and Dan.
if err := d.DialAndSend(m); err != nil {
panic(err)
}
}
https://godoc.org/gopkg.in/gomail.v2#example-package
channel
/********************************************
channel支持for range
1 如果没有出现关闭,会出现 deadlock的错误|不关闭,出现的错误fatal error: all goroutines are asleep - deadlock!
2 在遍历时,如果channel已经关闭,则会正常遍历数据,遍历完后,就会退出遍历|
*********************************************/
func forEach() {
intChan := make(chan int, 100)
for i := 0; i < 100; i++ {
intChan <- i * 2 //放入100个数到管道
}
close(intChan) //遍历之前不关闭 会有问题
for v := range intChan {
fmt.Println(v)
}
}
select
import (
"fmt"
"time"
)
func main() {
// 使用select可以解决 管道取数据的阻塞
intChan := make(chan int, 10)
for i := 0; i < 10; i++ {
intChan <- i
}
strChar := make(chan string, 5)
for i := 0; i < 5; i++ {
strChar <- "hello " + fmt.Sprintf("%02d", i)
}
fmt.Println(<-intChan)
/********************************************
传统的方法在遍历管道时,如果不关闭会阻塞而 导致deadlock。
实际开发中,存在 不确定什么时候关闭管道合适,可以使用select解决
*********************************************/
label:
for {
select {
case v := <-intChan: //如果intChan 没有关闭,不会一直阻塞。会自动匹配下一个case
fmt.Println(v)
time.Sleep(1e9)
case str := <-strChar:
fmt.Println(str)
default:
fmt.Println("都取不到了")
//return|会退出程序
break label //最好使用return
}
}
}
信号
https://blog.csdn.net/guyan0319/article/details/90240731
https://www.jianshu.com/p/de223458f8c7
下面示例代码来自 https://taohuawu.club/goroutine-concurrency-control-and-communication
package main
import (
"fmt"
"os"
"os/signal"
"sync"
"syscall"
"time"
)
func consumer(stop <-chan bool) {
for {
select {
case <-stop:
fmt.Println("exit sub goroutine")
return
default:
fmt.Println("running...")
time.Sleep(500 * time.Millisecond)
}
}
}
func main() {
stop := make(chan bool)
var wg sync.WaitGroup
// Spawn example consumers
for i := 0; i < 3; i++ {
wg.Add(1)
go func(stop <-chan bool) {
defer wg.Done()
consumer(stop)
}(stop)
}
waitForSignal()
close(stop)
fmt.Println("stopping all jobs!")
wg.Wait()
}
func waitForSignal() {
sigs := make(chan os.Signal)
//信号的使用
signal.Notify(sigs, os.Interrupt) //向进程发送中断
signal.Notify(sigs, syscall.SIGTERM) // 结束程序(可以被捕获、阻塞或忽略)
<-sigs
}