# Bytes
首先,Golang 里采用的编码方式为 UTF-8,所以不会出现中文乱码问题,但是这又会出现一些新的问题。比如:
package main | |
import "fmt" | |
func main() { | |
s := "byebye武带university" | |
fmt.Println(s[6:8]) | |
} |
要截取其中的 武带
,然后你会发现 出现乱码。
但是 fmt.Println(s[6:12])
显示却是 武带
这就是因为,golang 默认用 utf8 编码,这就导致它会将 str 的切片解释为 utf8 的切片,那么实际上 s 的表示是什么?
[]byte(s)
:
所以它实际上是用字节组成了一个 utf8 编码。
每个中文字符实际上就是一个 code point
。
这里有一篇文章解释了 utf8 和 Unicode 的关系。搞清楚 Unicode Codepoint
同时如果用 stings.Index(s,substr string)
来查找 index。
fmt.Printf("strings.Index(s, \"带\"): %v\n", strings.Index(s, "带"))
返回 9
而不是 7
,可以看到 string 也是用的也是字节索引。
问题来了,怎么找 Unicode 的位置索引呢?这个问题我现在也没想到。
但是如果用 []rune(s)
,并且打印得到结果:
可以看到 rune 是直接就解释为 Unicode 值。用这个就可以直接索引。
fmt.Println(r[6:8])
现在就可以打印为 武带
。这个方法要记住。
# Buffer 和 reader
可以查看文档。
记住 b := bytes.NewBuffer(make([]*byte*, 0))
这个会生成 buffer,这个 buffer 有一系列的 API 到时候查文档使用就行了。
Reader 也一样,反正,这些接口能用到的时候再去查文档。
# errors
这个库比较简单,但是我还是没怎么看懂。
package main | |
import ( | |
"errors" | |
"fmt" | |
"time" | |
) | |
type Myerror struct { | |
When time.Time | |
what string | |
} | |
func (e Myerror) Error() string { | |
return fmt.Sprintln(e.When, e.what) | |
} | |
func test() error { | |
return Myerror{ | |
When: time.Date(2020, 12, 10, 2, 2, 2, 2, time.UTC), | |
what: "有猫饼", | |
} | |
} | |
func main() { | |
err := test() | |
fmt.Printf("%T", err) | |
if err != nil { | |
fmt.Println(err.Error()) | |
} | |
b := errors.Is(err, test()) | |
fmt.Printf("b: %v\n", b) | |
if errors.Is(err, test()) { | |
fmt.Printf("err.Error(): %v\n", err.Error()) | |
} | |
} |
自定义打印一个 有猫饼
的错误。
error 接口的定义就是实现了 Error
函数,而这个 Error
函数只返回 string
用 errros.Is
可以判断这个错误是否是同一个错误。如果我将 test
中的 Myerror
的生成改为 when: time.Now()
。那么 Is
就不会判断为同一错误。