Go 语言类型 字节型
基本概念
字节类型用于表示单个数据字节,本质上是 uint8
类型别名,在内存中长度为 1 字节。单个字节可以用来存储一个标准 ASCII 字符,更常用于处理和表示二进制数据。
声明和初始化
初始化时,可以将字符或不大于 255 的正整数赋值给字节型变量:
package main import "fmt" func main() { // 默认零值为 0 var a byte // 声明为字节类型,赋值字符 var b byte = 'b' // 短变量声明,使用数字字面值(ASCII 码值) c := byte(99) fmt.Printf("字符值: %c,ASCII 码值:%v\n", a, a) // 输出字符 和 ASCII 码值 0 fmt.Printf("字符值: %c,ASCII 码值:%v\n", b, b) // 输出字符 b 和 ASCII 码值 98 fmt.Printf("字符值: %c,ASCII 码值:%v\n", c, c) // 输出字符 c 和 ASCII 码值 99 }
字节型切片
字节型切片几乎用于所有读写接口中,可以直接使用字节字面值数组初始化字节切片,也可以将字符串转换为字节切片:
package main import "fmt" func main() { // 字节型切片转字符串 byteSlice1 := []byte{72, 101, 108, 108, 111} // 直接使用字节值 fmt.Println(string(byteSlice1)) // 输出: "Hello" // 字符串转字节型切片 byteSlice2 := []byte("World") fmt.Println(byteSlice2) // 输出: [87 111 114 108 100] }
在标准库 bytes
包中,提供一系列方法和函数,用于操作和处理字节切片。下面是个简单演示:
package main import ( "bytes" "fmt" ) func main() { a := []byte("hello, world! ") b := []byte("golang") // 比较操作,结果为布尔值 fmt.Println(bytes.Equal(a, b)) // 输出:false // 修剪操作,修剪切片首尾中感叹号 fmt.Println(string(bytes.Trim(a, "!"))) // 输出:hello, world // 分割操作,以逗号作为分割符,最多分割 2 次 c := bytes.SplitN(a, []byte(", "), 2) fmt.Println(c) // 输出:[[104 101 108 108 111] [119 111 114 108 100 33]] // 连接操作,将两个切片用 - 拼接起来 fmt.Println(string(bytes.Join(c, []byte(" - ")))) // 输出:hello - world! // 搜索操作,搜索指定内容位置或搜索是否包含指定内容 fmt.Println(bytes.Index(a, []byte("world"))) // 输出:7 fmt.Println(bytes.LastIndex(a, []byte("o"))) // 输出:8 fmt.Println(bytes.Contains(a, []byte("world"))) // 输出:true // 替换操作,将 world 替换为 golang,不限替换次数 fmt.Println(string(bytes.Replace(a, []byte("world"), b, -1))) // 输出:hello, golang! // 写入缓冲区,支持字节切片 var buffer bytes.Buffer buffer.Write(a) buffer.Write(b) fmt.Println(buffer.String()) // 输出:hello, world!golang }
大多数 bytes
包中功能和用法同 strings
包相似。
使用场景
字节类型常用于文件读写、网络编程和数据加密等操作中。
文件读写
文件通常以二进制格式存储和读取,所以字节类型在文件读写操作中被广泛使用:
package main import ( "fmt" "os" ) func main() { // 创建一个字节切片,并写入文件 initialData := []byte{0x01, 0x02, 0x03, 0x04, 0x05} os.WriteFile("example.bin", initialData, 0644) // 读取刚刚创建的二进制文件 data, _ := os.ReadFile("example.bin") // 进行一些数据修改 data[0] = 0x63 data[1] = 0xFF // 打印文件内容 fmt.Println(data) // 输出:[255 238 3 4 5] fmt.Println(string(data)) }
网络编程
在网络编程中,数据用字节流传输,使用字节切片可以直接操作这些字节:
package main import ( "fmt" "net" ) func main() { // 建立连接 conn, _ := net.Dial("tcp", "example.com:80") defer conn.Close() // 发送 HTTP GET 请求 request := "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" conn.Write([]byte(request)) // 读取响应中前 256 个字节 response := make([]byte, 256) n, _ := conn.Read(response) fmt.Println(string(response[:n])) }
数据加密
数据加密也是直接操作字节,以减少内存使用:
package main import ( "crypto/sha256" "fmt" ) func main() { data := "important data" hash := sha256.Sum256([]byte(data)) fmt.Printf("SHA-256 Hash: %x\n", hash) }