码迷,mamicode.com
首页 > 其他好文 > 详细

[]byte和string

时间:2021-04-16 11:52:53      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:写法   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 

 

[]byte和string

标签:写法   nec   tail   数组   sdn   blog   present   integer   net   

原文地址:https://www.cnblogs.com/xuweiqiang/p/14662875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!