Go 学习

GO 语言学习

学习

安装

  • Linux

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    下载 > 解压 > 设置

    下载:
    wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz

    解压:
    tar -C /usr/local/ -xzf go1.13.5.linux-amd64.tar.gz

    > cd /usr/local/go
    > bin/go version
    > go version go1.13.5 linux/amd64

    设置:
    >> vim /etc/profile
    >> 添加到最后如下指令
    #go path
    GOROOT=/usr/local/go
    export PATH=$PATH:$GOROOT/bin
    >> 退出 wq ,执行: source %
    >> go env //可以正常打印内容 说明安装成功



    GOROOT
    GOPATH
    Mac系统下
    GOBIN
    PATH
  • Mac 设置 GoPath : https://www.jianshu.com/p/5c1873eaf3ca

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     编辑~/.bash_profile文件:
    export GOROOT=/usr/local/go

    export GOPATH=/Users/haodalai/Desktop/Go/project

    export GOBIN=

    export PATH=$PATH:${GOPATH//://bin:}/bin


    退出执行:
    source ~/.bash_profile


    Or

    编辑~/.zshrc文件

    export GOROOT=/usr/local/go

    export GOPATH=/Users/haodalai/Desktop/Go/project

    export GOBIN=

    export PATH=$PATH:${GOPATH//://bin:}/bin


    退出执行:

    source ~/.zshrc


    最终执行:
    >> echo $GOPATH
  • 【注意: 以后开发的项目都放在$GOPATH 的 src 目录下】

Mac

Windows

指令操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
go run 
-v 列出被编译的代码包名称
-a 强制执行
-work 显示临时工作目录并不删除它
-x 打印命令 并执行过它的
-n 打印编译的命令但不执行他们
-p n: 并行编译 其中 n 为并行的数量



go build 编译源码文件或代码包

go install 编译并安装代码或者源码文件
查看执行文件:
ls $GOBIN


go get 从远程代码仓库上下载安装代码包
下载到$GOPATH下 第一个文件的的 src文件夹中
-d 只执行下载动作不执行安装动作
-fix 下载后先执行修正动作 再进行编译安装
-U 利用网络来更新已有的代码包及其依赖包

Import 操作:

  • 如果一个 main 导入其他包,包将被顺序导入
  • 如果导入的包依赖其他包(包 B),会首先导入 B 包,然后初始化 B 包中常量和变量,最后如果 B 包中有 init,会自动执行 init()
  • 如果包导入完成后对 main 中常量和变量进行初始化,执行 main 中的 init函数
  • 如果一个包被导入多次则该包只会被导入一次
  • import 别名 “.” “_”
    1
    2
    3
    4
    别名:将导入的包命名为另一个容易记忆的别名
    点操作: .标识的包导入后,调用该包中函数时可以省略前缀包名
    下划线(_)操作: 导入该包,但不导入整个包,而是执行包中的 init 函数此无法通过包名来调用包中的其他函数
    使用下划线操作往往为了注册包中的引擎,让外部可以方便地使用

变量代码

  • 全局变量需要加上 var 方法体内则可以不用加上
  • 大写字母开头可以被包内其他文件导入,小写则不行

常量

  • 类型:显示 隐式
    1
    2
    3
    4
    显式:const identifier [type] = value
    隐式:const identifier = value (通常叫无类型常量)
    常量可以使用内置表达式定义 : 例如 len() unsafe.Sizeof()
    常量范围目前只支持布尔,数字,字符串

特殊常量 iota 使用

  • iota在 const 关键字出现时将被重置为0
  • const 中每新增一行常量声明将使 iota 计数一次
  • iota 常见用法
    1
    2
    3
    4
    1. 跳值使用法
    2. 插队使用法
    3. 表达式隐式使用法
    4. 单行使用法

编程

例子1 : Http:HelloWorld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
"net/http"
)

func main() {
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
fmt.Fprint(writer,"Hello World! Mr.Sam赖")
})
http.ListenAndServe(":8989",nil)
}


访问: http://localhost:8989

例子2 : 多线程 + 线程间通信

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import "fmt"

func main() {

ch :=make(chan string)

for i:=0; i<10;i++ {
go hello(i, ch)
}

for {
msg :=<-ch
fmt.Print(msg)
}

}

func hello(i int,ch chan string) {
for {
ch <- fmt.Sprintf("Hello World...%d \n ", i)
}

}

例子3 : 数组的内部排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
"sort"
)

func main() {
//排序
arr:=[]int{45, 23, 6, 12, 1, 905, 16, 75}
sort.Ints(arr)
for _,val:=range arr {
fmt.Println(val)
}
}

例子4 : 单元测试操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main

import "testing"

/**
1.文件名称必须以: _test 作为后缀
2.忽略测试
t.SkipNow()
3.执行指令: go test -v
4.注意点:
方法名称一定需要 : Test_xxxx 名称 Test 为首字母大写
方法体参数内容 : t *testing.T
5.日志显示: t.Log() t.Error()
*/

func TestRepeat(t *testing.T) {
a :=repeat("a")
t.Log("a 的值"+ a)
k := "aaaaa"
if a == k {
t.Logf("测试成功,a 的值为 : %s",a)
}

}

func TestPk(t *testing.T) {
t.Log( t.Name(),"开始执行 Pt 的内容")
for i:=0;i< 9 ;i++ {
repeat("a")
}
}

func repeat(s string) string{
var result string
for i:=0; i<5 ;i++ {
result+= "a"
}
return result
}


func TestAdd(t *testing.T) {
//忽略测试
//t.SkipNow()
t.Log(t.Name(), "Begin....")
a := 2
b := 3
if add(a,b) != 5{
t.Errorf("result %d ",add(a, b))
}
t.Logf("a + b is : %d",add(a,b))
t.Log(t.Name(), "end....")
}


func add(a,b int) int {
return a + b
}


/**
go test -v
打印结果:
=== RUN TestRepeat
--- PASS: TestRepeat (0.00s)
lx_test.go:18: a 的值aaaaa
lx_test.go:21: 测试成功,a 的值为 : aaaaa
=== RUN TestPk
--- PASS: TestPk (0.00s)
lx_test.go:27: TestPk 开始执行 Pt 的内容
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
lx_test.go:45: TestAdd Begin....
lx_test.go:51: a + b is : 5
lx_test.go:52: TestAdd end....
PASS
*/

例子5 : 基准测试

  • 参考链接 : http://c.biancheng.net/view/124.html
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    /**
    参考链接 : http://c.biancheng.net/view/124.html
    基准测试:
    1.一定需要方法名称 : Benchmark开头
    2.执行的指令:
    go test -v -bench=.
    go test -v -bench=. jz_test.go
    增加自定义时间:
    go test -v -bench=. -benchtime=5s jz_test.go

    */

    func BenchmarkAdd(b *testing.B) {
    var n int
    for i:=0;i<b.N;i++ {
    n++
    }
    }

    /**
    执行:
    go test -v -bench=.
    打印的内容:
    goos: darwin
    goarch: amd64
    BenchmarkAdd-16 1000000000 0.238 ns/op
    PASS

    测试说明:
    执行了: 1000000000 次
    每次的操作时间: 0.238 ns
    */
感谢您的阅读,本文由 左之右 版权所有。如若转载,请注明出处:左之右(https://zuoyoulai.github.io/2019/12/29/Go-Study/
Linux-Vim 插件,指令的学习
Git使用内容