golang 笔记

安装坑

在安装一些扩展时会出现下面这种错误:

1
2
3
4
5
go get -u -t -v github.com/golang/lint/golint
github.com/golang/lint (download)
Fetching https://golang.org/x/tools/go/gcexportdata?go-get=1
https fetch failed: Get https://golang.org/x/tools/go/gcexportdata?go-get=1: dial tcp 172.217.10.241:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
package golang.org/x/tools/go/gcexportdata: unrecognized import path "golang.org/x/tools/go/gcexportdata" (https fetch: Get https://golang.org/x/tools/go/gcexportdata?go-get=1: dial tcp 172.217.10.241:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)

由于国内环境被墙了导致下载失败,此时可以用以下方式解决:

1
2
3
4
5
6
7
8
# 创建目录
mkdir -p $GOPATH/src/golang.org/x
# 进入
cd $GOPATH/src/golang.org/x
# 从github拉取备份下来,具体可以在这里找到golang的源码备份:https://github.com/golang
git clone https://github.com/golang/tools.git
# 再安装一次
go get golang.org/x/tools

某些特性

定义并赋值

1
2
3
cat := "merry"
a := 111
chats := []string{"A","B","C"}

循环

Range的使用,以下是描述

在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对的 key 值。

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
package main
import "fmt"
func main() {
//这是我们使用range去求一个slice的和。使用数组跟这个很类似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
//在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
//range也可以用在map的键值对上。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
//range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
}

Map

Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

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
package main

import "fmt"

func main() {
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)

/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap [ "France" ] = "Paris"
countryCapitalMap [ "Italy" ] = "罗马"
countryCapitalMap [ "Japan" ] = "东京"
countryCapitalMap [ "India " ] = "新德里"

/*使用键输出地图值 */ for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [country])
}

/*查看元素在集合中是否存在 */
captial, ok := countryCapitalMap [ "美国" ] /*如果确定是真实的,则存在,否则不存在 */
/*fmt.Println(captial) */
/*fmt.Println(ok) */
if (ok) {
fmt.Println("美国的首都是", captial)
} else {
fmt.Println("美国的首都不存在")
}
}

类型转换

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

import "fmt"

func main() {
var sum int = 17
var count int = 5
var mean float32

mean = float32(sum)/float32(count)
fmt.Printf("mean 的值为: %f\n",mean)
}

一些常用例子

发送http请求

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
package main

import (
"fmt"
"net/http"
)

func main () {
// 创建请求
reqest, err := http.NewRequest("GET", "https://uxfeel.com", nil)
if err != nil {
fmt.Println(err)
}
// 设置header
reqest.Header.Add("cache-control", "no-cache")

// 创建http客户端,用于发送请求
client := &http.Client{}
// 执行发送请求
response, err := client.Do(reqest)
if err != nil {
fmt.Println(err)
}
// 使用`defer`设置方法将在当前方法运行结束前调用
// 这里意思是在当前方法运行结束前关闭response.Body
defer response.Body.Close()
}

编辑url

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
package main

import (
"fmt"
"net/url"
)

func main () {
_url, err := url.Parse("postgres://user:pass@host.com:5432/path?k=v#f")
if err != nil {
fmt.Println(err)
}

// 获得完整Query,?后面的参数字符串
fmt.Println(_url.RawQuery)

// 解析query字符串
query, err := url.ParseQuery(u.RawQuery)
// 编辑query
query.Add("test", 1)
query.Remove("k")

// 将编辑结果更新到url对象
_url.RawQuery = query.Encode()

fmt.Println(_url.RawQuery)
// out put: test=1
}

解析JSON

使用了bitly/go-simplejson这个包,这里是Api文档

安装

1
go get github/bitly/go-simplejson
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
package main

import (
"fmt"
"net/http"
"github.com/bitly/go-simplejson"
)

func main() {
reqest, err := http.NewRequest("GET", "https://jsonplaceholder.typicode.com/posts", nil)
if err != nil {
fmt.Println(err)
}
reqest.Header.Add("cache-control", "no-cache")
client := &http.Client{}
response, err := client.Do(reqest)
if err != nil {
fmt.Println(err)
}
defer response.Body.Close()

result, err := simplejson.NewFromReader(response.Body)
if err != nil {
fmt.Println(err)
}

title, err := result.GetIndex(2).Get("title")
if err != nil {
fmt.Println(err)
}
fmt.Println(title) //output: qui est esse
}

快速创建命令行应用

使用了github.com/urfave/cli这个包

安装

1
go get github.com/urfave/cli

使用

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
package main

import (
"fmt"
"log"
"os"

"github.com/urfave/cli"
)

func main() {
app := cli.NewApp()
app.Name = "boom"
app.Usage = "make an explosive entrance"

// 定义字段
app.Flags = []cli.Flag {
cli.StringFlag{
Name: "lang",
Value: "english",
Usage: "language for the greeting",
},
}

// 执行时调用
app.Action = func(c *cli.Context) error {
name := "Nefertiti"
if c.NArg() > 0 {
name = c.Args().Get(0)
}
if c.String("lang") == "spanish" {
fmt.Println("Hola", name)
} else {
fmt.Println("Hello", name)
}
return nil
}

// 运行
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}

一些资源