标签:写法 nec tail 数组 sdn blog present integer net
[]byte 和 string 的区别
这两个都经常用于初始化字符串,而且经常互相转换,很疑惑 []byte 究竟是什么
声明的方式有2种:[]byte("hello world") 或者 []byte{97,98} 注意这里是ASCII码其实等价于 []byte("ab")
打印看看:
package main import "fmt" func main(){ a := []byte{97,98} fmt.Println(a) // 输出[97 98] b := []byte("ab") fmt.Println((b)) // 输出[97 98] }
但是写法不太一样
b := []byte("Hello Gopher!") // 不要和 []byte{},[]byte{}是数组形式初始化[]byte,传递97那就是ASCII码97也就是对应的英文字母a
b [1] = ‘T‘ //允许修改
s := "Hello Gopher!"
s[1] = ‘T‘ //被禁止 - 也就是字符串只能被替换不能被修改
他们之间的转换(标准转换)是:
// string to []byte
s1 := "hello"
b := []byte(s1)
// []byte to string
s2 := string(b)
关于强转换这里暂不讨论;
而golang之中,byte是uint8的别名,在go标准库builtin中有如下说明:
// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8
说人话,其实 []byte 本质上等于 []int8 (0-255整数=1个字节=8个2进制数)
所以你会发现
b := []byte("abcd")
fmt.Println(b) // 打印结果是:[97 98 99 100] 这个97是ASCII码
b = []byte("你好")
fmt.Println(b) // 打印结果是:[228 189 160 229 165 189]
而string的数据结构
// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing UTF-8-encoded text. A string may be empty, but
// not nil. Values of string type are immutable.
type string string
说人话:string就是一个8位字节的集合(至于你要问我ascii、unicode之类的请看 https://blog.csdn.net/whocarea/article/details/87783614 )
string经常被转换为 []byte 其实就是 字符串转换为一个 以ASCII码为值组成的数组 格式存储的数据
参考文章:
https://segmentfault.com/a/1190000037679588
标签:写法 nec tail 数组 sdn blog present integer net
原文地址:https://www.cnblogs.com/xuweiqiang/p/14662875.html