(一) GoLang快乐编程

Scroll Down

Go安装环境

wget https://................../go1.10.2.darwin-amd64.tar.gz
tar -C /usr/local -xzf go1.10.2.darwin-amd64.tar.gz

配置GOROOT和PATH

vim ~/.bash_profile

# ~/.bash_profile文件中添加以下2条命令
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

source ~/.bash_profile

Go安装结果检验

go version
go version go1.8.5 darwin/amd64

GoLand下载

这个没得选,官网下载去

配置GOPATH,这一步非常重要,否则代码中的依赖包将无法识别。GOPATH都配置到项目名这一层 

还有对Go Run 配置 Run Kind改为 package

GoLand常用快捷键

CTRL+N 查找类
CTRL+SHIFT+N 查找文件
CTRL+SHIFT+ALT+N 查找类中的方法或变量
CTRL+B 快速打开光标处的类或方法
CTRL+G 定位行
F4 查找变量来源
CTRL+ALT+F7 选中的字符查找工程出现的地方

Alt+Enter 导入包,自动修正
CTRL+ALT+L 格式化代码

CTRL+D 复制行
CTRL+X 剪切,删除行

CTRL+ALT ←/→ 返回上次编辑的位置
ALT+J 相同单词多选

GoLand远程开发

使用GoLand的File Watchers插件, 监测代码变化(on save), 然后使用rsync把代码同步到虚拟机当中

虚拟机环境配置

  • GO 环境安装

    安装go完毕之后,设置环境变量

  • dlv 安装

    go get -u github.com/go-delve/delve/cmd/dlv

本地机器环境配置

  • 本地GO环境配置

    安装go完毕之后,设置环境变量

  • GoLand配置remote hosts access插件
  • GoLand配置File Watcher插件

    添加新的Watcher,使用scp或者rsync来实现文件同步到远端机器

GoLand添加远程服务器信息

点击tools->deployment->configuration,配置ssh登录和设置mapping文件映射。

开发测试

  • 在虚拟机上执行命令,启动dlv调试

    dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo

  • 开发机器断点启动Go Remote即可

开胃菜

Go 语言的数组(array)类型和切片(slice)类型。

它们的共同点是都属于集合类的类型,并且,它们的值也都可以用来存储某一种类型的值(或者说元素)。不过,它们最重要的不同是:数组类型的值(以下简称数组)的长度是固定的,而切片类型的值(以下简称切片)是可变长的。数组的长度在声明它的时候就必须给定,并且之后不会再改变。可以说,数组的长度是其类
型的一部分。
比如,[1]string和[2]string就是两个不同的数组类型。而切片的类型字面量中只有元素的类型,而没有长度。切片的长度可以自动地随着其中元素数量的增长而增长,但不会随着元素数量的减少而减小
slice
我们其实可以把切片看做是对数组的一层简单的封装,因为在每个切片的底层数据结构中,一定会包含一个数组。数组可以被叫做切片的底层数组,而切片也可以被看作是对数组的某个连续片段的引用。

也正因为如此,Go 语言的切片类型属于引用类型,同属引用类型的还有字典类型、通道类型、函数类型等;而 Go 语言的数组类型则属于值类型,同属值类型的有基础数据类型以及结构体类型。

注意,Go 语言里不存在像 Java 等编程语言中令人困惑的“传值或传引用”问题。在 Go 语言中,我们判断所谓的“传值”或者“传引用”只要看被传递的值的类型就好了。

如果传递的值是引用类型的,那么就是“传引用”。如果传递的值是值类型的,那么就是“传值”。从传递成本的角度讲,引用类型的值往往要比值类型的值低很多。

我们在数组和切片之上都可以应用索引表达式,得到的都会是某个元素。我们在它们之上也都可以应用切片表达式,也都会得到一个新的切片。

我们通过调用内建函数len,得到数组和切片的长度。通过调用内建函数cap,我们可以得到它们的容量。

但要注意,数组的容量永远等于其长度,都是不可变的。切片的容量却不是这样,并且它的变化是有规律可寻的。

把切片看做是对数组的一层简单的封装,因为在每个切片的底层数据结构中,一定会包含一个数组。数组可以被叫做切片的底层数组,而切片也可以被看作是对数组的某个连续片段的引用。

切片表达式

express

一个切片的容量可以被看作是透过这个窗口最多可以看到的底层数组中元素的个数。

一旦一个切片无法容纳更多的元素,Go 语言就会想办法扩容。但它并不会改变原来的切片,而是会生成一个容量更大的切片,然后将把原有的元素和新元素一并拷贝到新切片中。在一般的情况下,你可以简单地认为新切片的容量(以下简称新容量)将会是原切片容量(以下简称原容量)的 2 倍。

但是,当原切片的长度(以下简称原长度)大于或等于1024时,Go 语言将会以原容量的1.25倍作为新容量的基准(以下新容量基准)。新容量基准会被调整(不断地与1.25相乘),直到结果不小于原长度与要追加的元素数量之和。

确切地说,一个切片的底层数组永远不会被替换。为什么?虽然在扩容的时候 Go 语言一定会生成新的底层数组,但是它也同时生成了新的切片。

它只是把新的切片作为了新底层数组的窗口,而没有对原切片,及其底层数组做任何改动。

请记住,在无需扩容时,append函数返回的是指向原底层数组的新切片,而在需要扩容时,append函数返回的是指向新底层数组的新切片。所以,严格来讲,“扩容”这个词用在这里虽然形象但并不合适。不过鉴于这种称呼已经用得很广泛了,我们也没必要另找新词了。

顺便说一下,只要新长度不会超过切片的原容量,那么使用append函数对其追加元素的时候就不会引起扩容。这只会使紧邻切片窗口右边的(底层数组中的)元素被新的元素替换掉。