Go语言学习笔记(一)

Go概述

Go语言全称是“Go Programming Language”,简称Go,但因为Go这个词太通用了,所以又称为Golang。
Go语言是谷歌09年发布的一款开源编程语言,它是基于编译、垃圾收集和并发的编程语言,它能让构造简单、可靠且高效的软件变得容易。

主要特点:

  • 简单、易学
  • 快速编译
  • 并发支持
  • 静态类型
  • 部署简单(直接通过go install命令便完成部署)
  • 开源免费

运行环境安装

Go有多种安装方式,常见的有三种:

  • Go源码安装: 这是一种标准的软件安装方式。对于经常使用Unix类系统的用户,尤其对于开发者来说,从源码安装是最方便而熟悉的。(在Go的源代码中,有些部分是用Plan 9 C和AT&T汇编写的,因此如果要想从源码安装,就必须安装C的编译工具。如Mac系统需要安装Xcode;类Unix系统需要安装gcc等工具;Windows系统需要安装MinGW,再通过MinGW安装gcc)
  • Go标准包安装: Go提供了方便的安装包,支持Windows、Linux、Mac等系统。这种方式适合初学者,可根据自己的系统位数下载好相应的安装包,一路next就可以轻松安装了。
  • 第三方工具安装: 目前有很多方便的第三方软件包工具,例如Ubuntu的apt-get、Mac的homebrew等。这种安装方式适合那些熟悉相应系统的用户。

下载

为了图方便,本人选择了使用Go标准包安装,大家可从官方下载地址中下载,我电脑的是windows系统64位的,所以下载的是最新标准版的go1.8.windows-amd64.msi

安装

下载完成后双击便可安装,其默认是安装在C:\Go中(如果是类Unix系统,会默认安装在/usr/local/go),当然也可以自行修改他们的安装位置,我这边修改的是D:\Go

环境配置

环境变量需要配置以下三个:

  • GOROOT=D:\GO
    Go的安装路径,如果在安装时没有修改默认的安装路径,就是C:\Go
  • GOPATH=D:\workspace_golang
    这里指向的是工作空间,不是Go的安装目录;工作空间允许有多个,多个时用英文分号分隔;工作空间约定需要有三个子目录:
    • src:用于存放源代码(比如:.go
    • pkg:编译后生成的类库文件(比如:.a
    • bin:编译后生成的可执行文件
  • PATH=[PATH];%GOROOT%\bin

操作完以上步骤,就可在cmd命令窗口中输入go,如果出现go的Usage信息,表示go已安装成功。(如果提示命令不存在,请检查PATH路径是否配置有go安装路径下的bin)

第一个Go程序

在前面说到的工作空间(我的工作空间是D:\workspace_golang)中创建目录src/hello,并在该目录中创建一个名为hello.go的文件,如下所示:

1
2
3
4
5
6
package main //command executable(命令行可执行程序)必须使用main作为package名字。
import "fmt" //标准类库的packages
func main() {
fmt.Printf("hello, world\n")
}

然后在cmd命令行中执行以下命令:
C:> D:
D:> cd workspace_golang/src/hello
D:\workspace_golang\src\hello> go build
执行完成后会在当前目录下生成可执行文件hello.exe,命令行中执行该文件,显示效果如下:

也可以直接在D:\workspace_golang\src\hello目录下执行go run hello.go命令,显示效果同上。
通过使用Go语言提供的go install命令可以一步将源文件编译打包(打包:将编译后产生的可执行文件和类库移动到bin和pkg目录下)。

注意:在Go程序中,行分隔符键是语句终止符。 也就是说,每个单独的语句不需要在句尾加;

package

Go源文件必须以包声明开始:

1
package name

Go语言的package用于封装一个相对独立的功能提供给外部使用。

package的特征及规则

  1. package对应一个目录,其中name是包导入(import package)的默认名称,包中所有文件必须使用相同的package名称(这点类似Java)。
  2. package中的源代码存放目录以package最后一个/结束的为准,如package math/rand,那么源代码都在rand目录下。
  3. main是一个特殊的package名字,类似Java的main函数,Go的可执行程序必须声明package main。
  4. 源代码文件中,以大写字母开头的函数才会被导出/外部访问(类似Java的public访问权限)
  5. import package有以下两种形式:
1
2
import "fmt"
import "math/rand"
1
2
3
4
import (
"fmt"
"math/rand"
)

function

  1. 函数的参数和返回值类型,都是写在最后,如:

    1
    2
    3
    func add(x int, y int) int {
    return x + y
    }
  2. 参数类型如果相同,前面类型申明可以省略,只在最后定义前面所有变量类型

    1
    2
    3
    func add(x, y int) int {
    return x + y
    }
  3. 可以返回多个值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package main
    import "fmt"
    func swap(x, y string) (string, string) {
    return y, x
    }
    func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b) // 执行结果:world hello
    }
  4. 函数体内的变量可以通过在函数声明中作为函数返回值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package main
    import "fmt"
    func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
    }
    func main() {
    fmt.Println(split(17)) // 执行结果:7 10
    }

第一个类库

在工作空间中新建src/stringutil目录,并新建一个reverse.go的文件:

1
2
3
4
5
6
7
8
9
package stringutil
func Reverse(s string) string{
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1{
r[i], r[j] = r[j], r[i]
}
return string(r)
}

修改hello.go,调用这个类库

1
2
3
4
5
6
7
8
9
package main
import (
"fmt"
"stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("!oG ,olleH")) // 执行结果:Hello, Go!
}

测试集成

Go有一个轻量级的测试框架,由go测试命令和测试包组成。
通过创建一个名称以_test.go结尾的文件来编写测试,该文件包含具有签名func (t *testing.T)的名为TestXXX的函数。测试框架会运行每个这样的函数;如果函数调用失败,如t.Errort.Fail,则测试被认为失败。
stringutil包下创建一个测试文件reverse_test.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package stringutil
import "testing" // 需要引入标准类库提供的testing
func TestReverse(t *testing.T){
cases := []struct{
in, want string
}{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世 ,olleH"},
{"", ""},
}
for _,c := range cases{
got := Reverse(c.in)
if got != c.want{
t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
}
}
}

命令行中执行go test命令,成功时返回如下:

失败时示例:

获取远程类库

Go提供go get命令获取远程源文件并做go install处理。下面是官方提供的示例:命令行中执行go get github.com/golang/example/hello,执行后会将远程代码clone到本地中,存放在工作空间的src目录下(如果有多个工作空间,默认存放在第一个工作空间中),go get命令还会将获取下来的远程源文件编译并生成执行文件/类库在bin和pkg目录下。所以可以理解成go get = git clone + go install。此命令常用来获取远程类库。

Go命令

  • go build:这个命令主要用于测试编译。如未指定文件名,默认编译当前目录下的所有Go源文件(一个目录下可以有多个源文件,但main包只能有一个)。如果需要编译指定的文件,执行命令示例:go build hello.go。在包的编译过程中,若有必要,会同时编译与之相关联的包。如果是main包,在执行go build之后,会在当前目录下生成一个可执行文件(该文件与源文件名称相同)。go build会忽略目录下以_.开头的go文件。
  • go clean:清除当前源码包中编译生成的文件。
  • go run:编译并运行Go程序。
  • go install:这个命令在内部实现上分成两步:
    1. 生成结果文件:可执行文件.exe,类库文件.a
    2. 把编译好的.exe.a文件分别移到$GOPATH/bin$GOPATH/pkg中。
  • go get:动态获取远程代码包,可以理解成go get = git clone + go install
  • go test:自动读取源码路径下名为*_test.go的文件,生成并运行测试可用的可执行文件。

参考资料

本人以上编写的内容参考自官网

  1. 下载、安装、环境配置、卸载说明:https://golang.org/doc/install
  2. 学习使用Go语言编程:https://golang.org/doc/code.html
坚持原创技术分享,您的支持将鼓励我继续创作!