Go by Example - Number Parsing, URL Parsing, SHA256 Hashes and Base64 Encoding

Go by Example - Number Parsing, URL Parsing, SHA256 Hashes and Base64 Encoding

介绍go中的数字解析, URL 解析, SHA256 哈希和Base64 编码

Number Parsing

从字符串中解析数字是许多程序中最基本但也是最常见的任务;下面介绍如何在 Go 中完成它。

number-parsing.go
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
package main

import (
"fmt"
// 内置软件包 strconv 提供数字解析功能
"strconv"
)

func main() {
// 对于 ParseFloat,这个 64 会告诉要解析多少位精度
f, _ := strconv.ParseFloat("1.234", 64)
fmt.Println(f)

// 对于 ParseInt,0 表示从字符串中推断基数。64 则要求结果符合 64 位
i, _ := strconv.ParseInt("123", 0, 64)
fmt.Println(i)

// ParseInt 可以识别十六进制格式的数字
d, _ := strconv.ParseInt("0x1c8", 0, 64)
fmt.Println(d)

// 还可使用 ParseUint
u, _ := strconv.ParseUint("789", 0, 64)
fmt.Println(u)

// Atoi 是一个方便的函数,用于基本的基 10 int 解析
k, _ := strconv.Atoi("135")
fmt.Println(k)

// 如果输入错误,解析函数会返回错误信息。
_, e := strconv.Atoi("wat")
fmt.Println(e)
}
log
1
2
3
4
5
6
7
$ go run number-parsing.go
1.234
123
456
789
135
strconv.ParseInt: parsing "wat": invalid syntax

接下来我们来看看另一项常见的解析任务:URL。

URL Parsing

URL提供了定位资源的统一方法。下面是如何在Go中解析URL。

url-parsing.go
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
package main

import (
"fmt"
"net"
"net/url"
)

func main() {
// 我们将解析这个示例 URL,其中包括方案、验证信息、主机、端口、路径、查询参数和查询片段
s := "postgres://user:pass@host.com:5432/path?k=v#f"

// 解析 URL 并确保没有错误
u, err := url.Parse(s)
if err != nil {
panic(err)
}

// 访问 Scheme 很简单
fmt.Println(u.Scheme)

// 用户包含所有身份验证信息;调用其中的用户名和密码以获取单个值
fmt.Println(u.User)
fmt.Println(u.User.Username())
p, _ := u.User.Password()
fmt.Println(p)

// Host 包含主机名和端口(如果有)。使用 SplitHostPort 提取它们
fmt.Println(u.Host)
host, port, _ := net.SplitHostPort(u.Host)
fmt.Println(host)
fmt.Println(port)

// 这里我们提取路径和 # 后面的片段
fmt.Println(u.Path)
fmt.Println(u.Fragment)

// 要获取 k=v 格式字符串的查询参数,请使用 RawQuery
// 也可以将查询参数解析为一个映射
// 解析后的查询参数映射是从字符串到字符串片段的映射,因此如果只想要第一个值,请将索引指向 [0]
fmt.Println(u.RawQuery)
m, _ := url.ParseQuery(u.RawQuery)
fmt.Println(m)
fmt.Println(m["k"][0])
}

运行我们的 URL 解析程序,可以看到我们提取的所有不同片段。

log
1
2
3
4
5
6
7
8
9
10
11
12
13
$ go run url-parsing.go
postgres
user:pass
user
pass
host.com:5432
host.com
5432
/path
f
k=v
map[k:[v]]
v

SHA256 Hashes

SHA256 哈希值常用于计算二进制或文本 Blob 的简短标识。例如,TLS/SSL 证书使用 SHA256 计算证书的签名。下面介绍如何在 Go 中计算 SHA256 哈希值。

sha256-hashes.go
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 (
// Go 在各种 crypto/* 软件包中实现了多个哈希函数
"crypto/sha256"
"fmt"
)

func main() {
s := "sha256 this string"

// 在这里,我们从 new 一个 hash 开始
h := sha256.New()

// Write 希望使用字节
// 如果是字符串 s,可以使用 []byte(s) 将其强制转换为字节
h.Write([]byte(s))

// 这将以字节片的形式获取最终哈希结果
// Sum 的参数可用于追加到现有的字节片中:通常不需要
bs := h.Sum(nil)

fmt.Println(s)
fmt.Printf("%x\n", bs)
}

运行程序会计算哈希值,并以人类可读的十六进制格式打印出来。

log
1
2
3
$ go run sha256-hashes.go
sha256 this string
1af1dfa857bf1d8814fe1af8983c18080019922e557f15a8a...

您可以使用与上图类似的模式计算其他哈希值。例如,要计算 SHA512 哈希值,请导入 crypto/sha512,并使用 sha512.New()。
请注意,如果需要加密安全的哈希值,则应仔细研究哈希值强度

Base64 Encoding

Go 提供对 base64 编码/解码的内置支持。

base64-encoding.go
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
package main

import (
// 该语法以 b64 名称导入编码/base64 软件包,而不是默认的 base64
// 这将为我们节省一些空间
b64 "encoding/base64"
"fmt"
)

func main() {
// 下面是我们要编码/解码的字符串
data := "abc123!?$*&()'-=@~"

// Go 支持标准和 URL 兼容的 base64
// 下面介绍如何使用标准编码器进行编码
// 编码器要求使用[]字节,因此我们要将字符串转换为这种类型
sEnc := b64.StdEncoding.EncodeToString([]byte(data))
fmt.Println(sEnc)

// 解码可能会返回错误,如果还不知道输入是否格式正确,可以检查一下
sDec, _ := b64.StdEncoding.DecodeString(sEnc)
fmt.Println(string(sDec))
fmt.Println()

// 使用与 URL 兼容的 base64 格式进行编码/解码
uEnc := b64.URLEncoding.EncodeToString([]byte(data))
fmt.Println(uEnc)
uDec, _ := b64.URLEncoding.DecodeString(uEnc)
fmt.Println(string(uDec))
}

标准编码器和 URL base64 编码器对字符串的编码值略有不同(尾部 + 与 -),但它们都能按要求解码为原始字符串。

log
1
2
3
4
5
$ go run base64-encoding.go
YWJjMTIzIT8kKiYoKSctPUB+
abc123!?$*&()'-=@~
YWJjMTIzIT8kKiYoKSctPUB-
abc123!?$*&()'-=@~

参考链接

Go by Example - Number Parsing, URL Parsing, SHA256 Hashes and Base64 Encoding

https://blog.wty.cool/2024/05/04/go_by_example/Number_Parsing-URL_Parsing-SHA256_Hashes-Base64_Encoding/

作者

孤独小狼

发布于

2024-05-04

更新于

2024-05-04

许可协议

评论