Go学习日记2

1.Go语言切片[Slice]
解析:
[1]声明一个未指定大小的数组来定义切片

var identifier []type

[2]使用make()函数来创建切片

var slice1 []type = make([]type, len)
也可以简写为:
slice1 := make([]type, len)

说明:可以指定容量,其中capacity为可选参数。

2.s :=make([]int,len,cap)
解析:通过内置函数make()初始化切片s,[]int标识为其元素类型为int的切片。
[1]切片是可索引的,并且可以由len()方法获取长度
[2]切片提供了计算容量的方法cap()可以测量切片最长可以达到多少

3.append()和copy()函数
解析:如果想增加切片的容量,必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

4.Go语言范围[Range]
解析:Go语言中range关键字用于for循环中迭代数组[array]、切片[slice]、通道[channel]或集合[map]的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回key-value对。

5.Go语言Map[集合]
解析:可以使用内建函数make也可以使用map关键字来定义Map:

/* 声明变量,默认map是nil */
var map_variable map[key_data_type]value_data_type

/* 使用make函数 */
map_variable := make(map[key_data_type]value_data_type)

说明:如果不初始化map,那么就会创建一个nil map。nil map不能用来存放键值对。

6.delete()函数
解析:delete()函数用于删除集合的元素,参数为map和其对应的key。

7.Go语言类型转换
解析:类型转换用于将一种数据类型的变量转换为另外一种类型的变量:

type_name(expression)

说明:type_name为类型,expression为表达式。

扫描二维码关注公众号,回复: 10534298 查看本文章

8.Go语言接口
解析:Go语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其它类型只要实现了这些方法就是实现了这个接口。

/* 定义接口 */
type interface_name interface {
   method_name1 [return_type]
   method_name2 [return_type]
   method_name3 [return_type]
   ...
   method_namen [return_type]
}

/* 定义结构体 */
type struct_name struct {
   /* variables */
}

/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
   /* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
   /* 方法实现*/
}

9.Go错误处理
解析:Go语言通过内置的错误接口提供了非常简单的错误处理机制。error类型是一个接口类型:

type error interface {
    Error() string
}

10.Go并发
解析:Go语言支持并发,只需要通过go关键字来开启goroutine即可。goroutine是轻量级线程,goroutine的调度是由Golang运行时进行管理的。

go 函数名( 参数列表 )

Go允许使用go语句开启一个新的运行期线程,即goroutine,以一个不同的、新创建的goroutine来执行一个函数。同一个程序中的所有goroutine共享同一个地址空间。

11.Go通道[channel]
解析:通道[channel]是用来传递数据的一个数据结构。通道可用于两个goroutine之间通过传递一个指定类型的值来同步运行和通讯。

12.Go通道缓冲区
解析:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。通道可以设置缓冲区,通过make的第二个参数指定缓冲区大小:

ch := make(chan int, 100)

[1]带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据
[2]不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据
[3]如果通道不带缓冲,发送方会阻塞直到接收方从通道中接收了值
[4]如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内
[5]如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞

13.Go遍历通道与关闭通道
解析:Go通过range关键字来实现遍历读取到的数据:

v, ok := <-ch

如果通道接收不到数据后ok就为false,这时通道就可以使用close()函数来关闭。

14.Ubuntu安装Go和Goland
解析:

export GOROOT=/usr/local/go
export GOPATH=/home/xxx/go_path
export GOARCH=amd64
export GOOS=linux
export GOBIN=$GOROOT/bin/
export GOTOOLS=$GOROOT/pkg/tool/
export PATH=$PATH:$GOBIN:$GOTOOLS
export GO111MODULE=on

15.GO111MODULE
解析:
[1]当为on时则使用Go Modules,go会忽略$GOPATH和vendor文件夹,只根据go.mod下载依赖。
[2]当为off时则不适用新特性Go Modules支持,它会查找vendor目录和$GOPATH来查找依赖关系,也就是继续使用“GOPATH模式”。
[3]当为auto时或未设置时则根据当前项目目录下是否存在go.mod文件或$GOPATH/src之外并且其本身包含go.mod文件时才会使用新特性Go Modules模式,并且auto为GO111MODULE的默认值。
说明:通过GO111MODULE=on或off开启或关闭GoModule特性。

16.goproxy和go modules配合使用
解析:

export GO111MODULE=on
export GOPROXY=https://goproxy.io

17.go.mod
解析:go.mod是Go项目的依赖描述文件,该文件主要用来描述两个事情:
[1]当前项目名[module]是什么。每个项目都应该设置一个名称,当前项目中的包[package]可以使用该名称进行相互调用。
[2]当前项目依赖的第三方包名称。项目运行时会自动分析项目中的代码依赖,生成go.sum依赖分析结果,随后go编译器会去下载这些第三方包,然后再编译运行。

18.go.sum
19.go.sum依赖分析文件,记录每个依赖库的版本和哈希值,通常go.sum应当被添加到版本管理中随着go.mod文件一起提交。

20.go modules常用命令
解析:
[1]go mod init:初始化modules
[2]go mod download:下载依赖的module到本地cache
[3]go mod edit:编辑go.mod文件,选项有-json、-require和-exclude,可以使用帮助go help mod edit
[4]go mod graph:以文本模式打印模块需求图
[5]go mod tidy:检查,删除错误或者不使用的modules,以及添加缺失的模块
[6]go mod vendor:生成vendor目录,将依赖复制到vendor目录下面
[7]go mod verify:验证依赖是否正确
[8]go mod why:解释为什么需要依赖
[9]go list -m:查看主模块的路径
[10]go list -m -f={{.Dir}}:查看主模块的根目录
[11]go list -m all:查看当前的依赖和版本信息

21.goland使用go modules
解析:在goland下,是推荐使用goland配置vgo来快速使用go modules的。而vgo是基于Go Modules规范的包管理工具,同官方的go mod命令工具类似。

22.govendor
解析:govendor的基本原理就是通过vendor.json文件描述来确定工程使用的外部包。

23.go get
解析:go get命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。比如, go get github.com/davyxu/tabtoy。
[1]-v:显示操作流程的日志及信息,方便检查错误
[2]-u:下载丢失的包,但不会更新已经存在的包
[3]-d:只下载,不安装
[4]-insecure:允许使用不安全的HTTP方式进行下载操作

24.go: cannot use path@version syntax in GOPATH mode
解析:go get命令需在go.mod同级目录下执行,否则会报该错误。

25.go build -mod=vendor
解析:在开启模块支持的情况下,用这个可以退回到使用vendor的时代。

参考文献:
[1]Go语言教程:https://www.runoob.com/go/go-tutorial.html
[2]goproxy和go modules的初步使用:https://blog.csdn.net/qq_42403866/article/details/93654421

发布了400 篇原创文章 · 获赞 423 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/shengshengwang/article/details/104474193