GO语言全栈工程师培训视频

  • 名称:GO语言全栈工程师培训视频
  • 分类:程序设计  
  • 观看人数:加载中
  • 时间:2021/8/18 15:54:46

一  简介

Go语言出自Ken Thompson、Rob Pike和Robert Griesemer之手,起源于2007年,并在2009年正式对外发布,其实都是Google的,设计Go语言的初衷都是为了满足Google的需求。Go的主要目标是“兼具Python等动态语言的开发速度和C/C++等编译型语言的性能与安全性”,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势。最主要还是为了并发而生,并发是基于goroutine的,goroutine类似于线程,但并非线程,可以将goroutine理解为一种虚拟线程。Go语言运行时会参与调度goroutine,并将goroutine合理地分配到每个CPU中,最大限度地使用CPU性能。

二  环境

我们玩Java的时候需要下载JDK,类似于此,用Go开发也需要下载Go,里面提供各种develop-kit、library以及编译器。在官网下载mac版本pkg后直接安装,最后用 go version 命令验证版本:

然后就是设置这两个环境变量,mac系统是在 .bash_profile 文件里面:

export GOROOT=/usr/local/go

export GOPATH=$HOME/go

GOROOT:表示的是Go语言编译、工具、标准库等的安装路径,其实就相当于配置JAVA_HOME那样。

GOPATH:这个和Java有点不一样,Java里并不需要设置这个变量,这个表示Go的工作目录,是全局的,当执行Go命令的时候会依赖这个目录,相当于一个全局的workspace。一般还会把$GOPATH/bin设置到PATH目录,这样编译过的代码就可以直接执行了。

1  纯文本开发

编写代码,可以保存在任意地方,例如新建一个helloworld目录,创建hello.go文件:

package main

import "fmt"

func main() {    

    fmt.Println("hello, world")

}

然后执行 go build hello.go 就可以编译出hello文件,在./hello就可以执行了;或者直接 go run hello.go 合二为一去执行。执行这个命令并不需要设置环境变量就可以了。看起来和c差不多,但是和Java不一样,运行的时候不需要虚拟机。早期的GO工程也是使用Makefile来编译,后来有了强大的命令 go build、go run,可以直接识别目录还是文件。

2  GoLand

自动import,超爽的体验!不用按command + /了!

运行项目需要设置build config,和Android、Java的都差不多,例如创建一个hello-goland项目:

导入go module项目的时候需要勾选这项,否则无法像maven/gradle那样sync下载依赖:

3  VSCODE

直接搜索Go插件,第一个最多安装量的就是了,我还没用过所以不太清楚如何。

三  工程结构

在设置GOPATH环境变量的时候,这个目录里面又分了三个子目录bin、pkg、src,分别用于存放可执行文件、包文件和源码文件。当我们执行Go命令的时候,如果我们指定的不是当前目录的文件或者绝对路径的目录的话,就会去GOPATH目录的去找。这样在GOPATH目录创建了xxx的目录后,就可以在任意地方执行 go build xx 命令来构建或者运行了。

pkg目录应该是在执行 go install 后生成的包文件,包括.a这样的文件,相当于一个归档。

├── bin

│   ├── air

│   ├── govendor

│   ├── swag

│   └── wire

├── pkg

│   ├── darwin_amd64

│   ├── mod

│   └── sumdb

└── src

    ├── calc

    ├── gin-blog

    ├── github.com

    ├── golang.org

    ├── google.golang.org

    ├── gopkg.in

    └── simplemath

这样对于我们具体项目来说并不好,没有Workspace的概念来隔离每个项目了,所以我觉得这个GOPATH目录放的应该是公用的项目,例如开源依赖的。我们在开发过程中,也会下载很多的依赖,这些依赖都下载到这个目录,和我们的项目文件混在一起了。

另外,通过IDE可以设置project的GOPATH,相当于在执行的时候给GOPATH增加了一个目录变量,也就是说,我们创建一个项目,然后里面也有bin、src、pkg这三个目录,和GOPATH一样的,本质上,IDE在运行的时候其实就是设置了一下GOPATH:

GOPATH=/Users/fuxing/develop/testgo/calc-outside:/Users/fuxing/develop/go #gosetup

Go语言在寻找变量、函数、类属性及方法的时候,会先查看GOPATH这个系统环境变量,然后根据该变量配置的路径列表依次去对应路径下的src目录下根据包名查找对应的目录,如果对应目录存在,则再到该目录下查找对应的变量、函数、类属性和方法。

其实官方提供了Go Modules的方法更好解决。

1  Go Modules

从Go 1.11版本开始,官方提供了Go Modules管理项目和依赖,从1.13版本开始,更是默认开启了对Go Modules的支持,使用Go Modules的好处是显而易见的 —— 不需要再依赖GOPATH,你可以在任何位置创建Go项目,并且在国内,可以通过 GOPROXY 配置镜像源加速依赖包的下载。也就是说,创建一个项目就是一个mod,基本上目前Go开源项目都是这样做的。其实就是类似于Maven和Gradle。

// 创建mod项目,也是可以用IDE来new一个mod项目的:

go mod init calc-mod

// 一般开源在github上面的项目名字是这样的;和maven、gradle不一样的是,开发完成根本不需要发布到仓库!只要提交代码后打tag就可以了

go mod init github.com/fuxing-repo/fuxing-module-name

// 创建一个模块:执行这个命令主要是多了一个go.mod文件,里面就一行内容:

module calc-mod

// import以后,执行下载依赖命令,不需要编辑go.mod文件。依赖会下载到GOPATH/pkg/mod目录

go list

用GoLand来打开不同的项目,显示依赖的外部库是不一样的,如果是用GOPATH创建的项目,需要用命令下载依赖包到GOPATH:

go get -u github.com/fuxing-repo/fuxing-module-name

四  语法

1  包:Package 和 Import

Java里面的包名一般是很长的,和文件夹名称对应,作用就是命名空间,引入的时候需要写长长的一串,也可以用通配符:

Go里面一般的包名是当前的文件夹名称,同一个项目里面,可以存在同样的包名,如果同时都需要引用同样包名的时候,就可以用alias区分,类似于JS那样。一般import的是一个包,不像Java那样import具体的类。同一个包内,不同文件,但是里面的东西是可以使用的,不需要import。这有点类似于C的include吧。如果多行的话,用括号换行包起来。

Go语言中,无论是变量、函数还是类属性及方法,它们的可见性都是与包相关联的,而不是类似Java那样,类属性和方法的可见性封装在对应的类中,然后通过 private、protected 和 public 这些关键字来描述其可见性,Go语言没有这些关键字,和变量和函数一样,对应Go语言的自定义类来说,属性和方法的可见性根据其首字母大小写来决定,如果属性名或方法名首字母大写,则可以在其他包中直接访问这些属性和方法,否则只能在包内访问,所以Go语言中的可见性都是包一级的,而不是类一级的。

在Java里面,只有静态,或者对象就可以使用点运算符,而且是极其常用的操作,而在Go里面,还可以用一个包名来点,这就是结合了import来使用,可以点出一个函数调用,也可以点出一个结构体,一个接口。另外区别于C,不管是指针地址,还是对象引用,都是用点运算符,不需要考虑用点还是箭头了!