Go语言基础和进阶之依赖管理、并发编程|青训营

74 阅读4分钟

Go语言基础

1.Go语言简介

1.1 产生背景

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 罗伯特·格瑞史莫(Robert Griesemer),罗布·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。

1.2 主要功能

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。不同于Java,Go内嵌了关联数组(也称为哈希表(Hashes)或字典(Dictionaries) ),就像字符串类型一样。

2.安装配置

2.1 安装Go语言

2.2 配置开发环境

安装VS Code或者Goland,VS Code需要安装Go插件。

Go语言进阶

1. 依赖管理

1.1Gopath

GOPATH既是一种依赖管理机制,也是一种项目管理机制。 GOPATH的主要作用有两个: 1.指定我们的工作区目录,并规定bin、pkg、src三个目录来存放不同类型的文件(体现了项目管理) 2.指定我们的依赖下载路径以及导入路径(体现了依赖管理) GOPATH其实也规定了依赖下载路径以及导入路径,即 $GOPATH/src 目录下。

1.2Go Vendor

1.进入到项目目录 2.使用govendor init命令初始化项目的依赖 3.运行govendor fetch命令增加依赖 4.打开./vendor/vendor.json查看依赖的包

1.3Go Module

Go Modules 的管理命令为go mod,go mod有很多子命令,你可以通过go help mod来获取所有的命令。 • download:下载 go.mod 文件中记录的所有依赖包。 • edit:编辑 go.mod 文件。 • graph:查看现有的依赖结构。 • init:把当前目录初始化为一个新模块。 • tidy:添加丢失的模块,并移除无用的模块。默认情况下,Go 不会移除 go.mod 文件中的无用依赖。当依赖包不再使用了,可以使用go mod tidy命令来清除它。 • vendor:将所有依赖包存到当前目录下的 vendor 目录下。 • verify:检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查下载后是否有修改。 • why:查看为什么需要依赖某模块。

2.并发编程

2.1 锁Lock

当多个 goroutine 同时操作一个变量时,会存在数据竞争,导致最后的结果与期待的不符,解决办法就是加锁。Go 中的 sync 包 实现了两种锁:Mutex 和 RWMutex,前者为互斥锁,后者为读写锁,基于 Mutex 实现。

2.2 线程同步WaitGroup

WatiGroup 能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 goroutine 执行完成。它有 3 个方法: Add():给计数器添加等待 goroutine 的数量。 Done():减少 WaitGroup 计数器的值,应在协程的最后执行。 Wait():执行阻塞,直到所有的 WaitGroup 数量变成 0。

感受

Go语言对于我来说是一门新的语言,以前没有接触过Go,通过学习发现Go和C语言有些相似的地方,但是相比较Go会更加简洁,用简单的语法实现复杂的东西。 例如

//Go语言
package main

import "fmt"

//实现1+2+3+……100
func exam() (sum int) {
	for i := 1; i <= 100; i++ {
		sum += i
	}
	return
}

func main() {
	var sum int
	sum = exam()
	fmt.Println("sum = ", sum)
}
//C语言
#include <stdio.h>
int main()
{
    int sum,i;
    sum=0;
    i=1;
    while(i<=100)
     {
        sum+=i;
        i++;
    }
    printf("%d\n",sum);
    return 0;
}