介绍go中的数字解析, URL 解析, SHA256 哈希和Base64 编码
Number Parsing
从字符串中解析数字是许多程序中最基本但也是最常见的任务;下面介绍如何在 Go 中完成它。
number-parsing.go1 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" )
func main() { f, _ := strconv.ParseFloat("1.234", 64) fmt.Println(f)
i, _ := strconv.ParseInt("123", 0, 64) fmt.Println(i)
d, _ := strconv.ParseInt("0x1c8", 0, 64) fmt.Println(d)
u, _ := strconv.ParseUint("789", 0, 64) fmt.Println(u)
k, _ := strconv.Atoi("135") fmt.Println(k)
_, e := strconv.Atoi("wat") fmt.Println(e) }
|
log1 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.go1 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() { s := "postgres://user:pass@host.com:5432/path?k=v#f"
u, err := url.Parse(s) if err != nil { panic(err) }
fmt.Println(u.Scheme)
fmt.Println(u.User) fmt.Println(u.User.Username()) p, _ := u.User.Password() fmt.Println(p)
fmt.Println(u.Host) host, port, _ := net.SplitHostPort(u.Host) fmt.Println(host) fmt.Println(port)
fmt.Println(u.Path) fmt.Println(u.Fragment)
fmt.Println(u.RawQuery) m, _ := url.ParseQuery(u.RawQuery) fmt.Println(m) fmt.Println(m["k"][0]) }
|
运行我们的 URL 解析程序,可以看到我们提取的所有不同片段。
log1 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.go1 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 ( "crypto/sha256" "fmt" )
func main() { s := "sha256 this string"
h := sha256.New()
h.Write([]byte(s))
bs := h.Sum(nil)
fmt.Println(s) fmt.Printf("%x\n", bs) }
|
运行程序会计算哈希值,并以人类可读的十六进制格式打印出来。
log1 2 3
| $ go run sha256-hashes.go sha256 this string 1af1dfa857bf1d8814fe1af8983c18080019922e557f15a8a...
|
您可以使用与上图类似的模式计算其他哈希值。例如,要计算 SHA512 哈希值,请导入 crypto/sha512,并使用 sha512.New()。
请注意,如果需要加密安全的哈希值,则应仔细研究哈希值强度!
Base64 Encoding
Go 提供对 base64 编码/解码的内置支持。
base64-encoding.go1 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 "encoding/base64" "fmt" )
func main() { data := "abc123!?$*&()'-=@~"
sEnc := b64.StdEncoding.EncodeToString([]byte(data)) fmt.Println(sEnc)
sDec, _ := b64.StdEncoding.DecodeString(sEnc) fmt.Println(string(sDec)) fmt.Println()
uEnc := b64.URLEncoding.EncodeToString([]byte(data)) fmt.Println(uEnc) uDec, _ := b64.URLEncoding.DecodeString(uEnc) fmt.Println(string(uDec)) }
|
标准编码器和 URL base64 编码器对字符串的编码值略有不同(尾部 + 与 -),但它们都能按要求解码为原始字符串。
log1 2 3 4 5
| $ go run base64-encoding.go YWJjMTIzIT8kKiYoKSctPUB+ abc123!?$*&()'-=@~ YWJjMTIzIT8kKiYoKSctPUB- abc123!?$*&()'-=@~
|
参考链接