Go学习笔记

楔子

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值