# 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) :

image-20220116133500753

所以它实际上是用字节组成了一个 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) ,并且打印得到结果:

image-20220116134151740

可以看到 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 就不会判断为同一错误。

更新于

请我喝[茶]~( ̄▽ ̄)~*

Kalice 微信支付

微信支付

Kalice 支付宝

支付宝