day03-go mod实战 | 青训营笔记

80 阅读2分钟
  1. 进程间的通信,同步
package main

import (
	"fmt"
	"os"
)

func main() {
	path := os.Getenv("GOPATH")//获取环境变量
		//exec.Command()    获取子进程和输入输出
	fmt.Println(os.Args) //进程相关的信息
	fmt.Println(path)
}
  • 两种通信方式--共享管道通信,和共享内存方式进行通信

  • 共享管道方式--通过chan来共享信息,实现通信

  • c :=make(chan int),比如这个,通过make来对其开辟空间,这是无缓冲的chan,数据类型为整形

  • c :=make(chan int ,3),通过make来对其开辟空间,这是有缓冲chan,缓冲区大小为3

  • 有缓冲和无缓冲的区别:无缓冲chan写入数据之后,需要等待其他进程从中取数据,这个过程就会阻塞,其他进程要从中读取数据的话,也需要阻塞,等待有数据进来;有缓冲的chan,缓冲区满之前,不需要等待别人取数据,也就是不会阻塞。

  • 如何读取数据: chan<-3 将3这个数据写进去;<-chan,chan中的数据取出并丢掉;c :=<-chan ,chan中的数据取出来,并且存到c中

  • 共享内存:,比如:

package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	x    int
	lock sync.Mutex
)

func memeryOn() {
	for i := 0; i < 5; i++ {
		lock.Lock()
		x += 1
		fmt.Println(x)
		lock.Unlock()
	}
}
func memeryOff() {
	for i := 0; i < 5; i++ {
		x += 1
		fmt.Println(x)
	}
}
func main() {
	x = 0
	go memeryOn()
	time.Sleep(2 * time.Second)
	x = 0
	go memeryOff()
	time.Sleep(2 * time.Second)
}

  • 共享内存时需要加锁: 如何加锁呢?-----》lcoak sync.mutex 然后调用里面的方法,来实现获取锁和释放锁 不建议使用共享内存来实现进程间通信,应该使用管道 因为共享内存会出现未知的错误
  • lock()获取锁;unlock()释放锁
  1. go mod 管理
  • 使用gopath太低效
  • go mod init 进行初始化
  • go get 下载相关依赖
  • proxy,下载资源的路径,direct源地址,如果proxy里的下不到东西,就去原网址进行下载
  • 默认使用最低兼容版本,最新版

大概就这些吧