gob은 Golang 패키지와 함께 제공되는 데이터 구조 직렬화를 위한 인코딩/디코딩 도구입니다. 인코더는 인코딩에 사용되고 디코더는 디코딩에 사용됩니다. Gob은 io.Writer 인터페이스를 사용하여 NewEncoder() 함수를 통해 Encoder 객체를 생성하고 Encode() 메서드를 호출하여 인코딩 작업을 구현합니다. io.Reader 인터페이스를 사용하여 NewDecoder() 함수를 통해 Decoder 객체를 생성하고 호출합니다. Decode() 메서드를 사용하여 디코딩 작업을 완료합니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
gob의 전체 이름은 다음과 같습니다: Go Binary
Golang의 자체 데이터 구조 직렬화 인코딩/디코딩 도구, 이는 gob이 무언가에 데이터 구조를 직렬화할 수 있고 변경 사항을 역직렬화할 수도 있다는 것을 의미합니다! 나중에 직렬화가 무엇인지 살펴보겠습니다. 문자열로 바뀌든 바이너리 스트림으로 바뀌든 상관없습니다. 어쨌든 함수는 직렬화입니다.
Gob을 사용할 때 Encoder 및 Decoder 개체에 주의해야 합니다. 이름에서 알 수 있듯이 하나는 인코딩할 때 사용되고 다른 하나는 디코딩할 때 사용됩니다.
따라서 Encoder 및 Decoder 개체를 얻으려면 이 두 함수를 호출해야 한다는 것이 분명합니다. 여기서 매개변수는 io.Writer와 io.Reader 인터페이스 유형이라는 점에 유의하세요. 이전 강의에서 이 두 인터페이스를 소개했으므로 여기서 필요한 매개변수는 각각 io.Writer와 io.Reader 인터페이스 유형을 구현하는 객체입니다.
Encoder와 Decoder에는 각각 하나의 주요 메소드가 있습니다.
여기서 보면 이미 다음과 같은 결론을 내릴 수 있습니다.
Gob은 io.Writer 인터페이스를 사용하고 NewEncoder() 함수를 통해 Encoder 객체를 생성합니다. . Encode() 메서드를 호출하여 인코딩 작업을 구현합니다. io.Reader 인터페이스를 사용하여 NewDecoder() 함수를 통해 Decoder 객체를 생성하고 Decode() 메서드를 호출하여 디코딩 작업을 완료합니다.
다음으로, gob을 쉽게 시작하기 위해 이 인코더와 디코더를 사용해 보겠습니다. 첫 번째 예를 살펴보겠습니다.
예 1: 데이터 구조와 bytes.Buffer 간 변환(바이트 슬라이스로 인코딩됨)
1package main 2 3import ( 4 "bytes" 5 "fmt" 6 "encoding/gob" 7 "io" 8) 9 10//准备编码的数据 11type P struct { 12 X, Y, Z int 13 Name string 14} 15 16//接收解码结果的结构 17type Q struct { 18 X, Y *int32 19 Name string 20} 21 22func main() { 23 //初始化一个数据 24 data := P{3, 4, 5, "CloudGeek"} 25 //编码后得到buf字节切片 26 buf := encode(data) 27 //用于接收解码数据 28 var q *Q 29 //解码操作 30 q = decode(buf) 31 //"CloudGeek": {3,4} 32 fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y) 33 34} 35 36func encode(data interface{}) *bytes.Buffer { 37 //Buffer类型实现了io.Writer接口 38 var buf bytes.Buffer 39 //得到编码器 40 enc := gob.NewEncoder(&buf) 41 //调用编码器的Encode方法来编码数据data 42 enc.Encode(data) 43 //编码后的结果放在buf中 44 return &buf 45} 46 47func decode(data interface{}) *Q { 48 d := data.(io.Reader) 49 //获取一个解码器,参数需要实现io.Reader接口 50 dec := gob.NewDecoder(d) 51 var q Q 52 //调用解码器的Decode方法将数据解码,用Q类型的q来接收 53 dec.Decode(&q) 54 return &q 55}
예 2 : 데이터 구조를 파일로 직렬화 및 역직렬화
1package main 2 3import ( 4 "encoding/gob" 5 "os" 6 "fmt" 7) 8 9//试验用的数据类型 10type Address struct { 11 City string 12 Country string 13} 14 15//序列化后数据存放的路径 16var filePath string 17 18func main() { 19 filePath = "./address.gob" 20 encode() 21 pa := decode() 22 fmt.Println(*pa) //{Chengdu China} 23} 24 25//将数据序列号后写到文件中 26func encode() { 27 pa := &Address{"Chengdu", "China"} 28 //打开文件,不存在的时候新建 29 file, _ := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666) 30 defer file.Close() 31 32 //encode后写到这个文件中 33 enc := gob.NewEncoder(file) 34 enc.Encode(pa) 35} 36 37//从文件中读取数据并反序列化 38func decode() *Address { 39 file, _ := os.Open(filePath) 40 defer file.Close() 41 42 var pa Address 43 //decode操作 44 dec := gob.NewDecoder(file) 45 dec.Decode(&pa) 46 return &pa 47}
위의 두 예는 어렵지 않습니다. 오류 처리 및 기타 코드를 제거하고 각 코드 블록에 주석을 달고 인내심을 갖고 읽어야 합니다. gob의 인코딩 및 디코딩의 본질을 이해할 수 있습니다.
gob이 무엇인지 이해한 것을 바탕으로, 개발에 gob을 사용해야 한다면 자세한 내용을 알아보려면 공식 문서를 자세히 읽어보는 것이 좋습니다: https://golang.org/pkg/encoding/gob/
[ 관련 추천 : Go 비디오 튜토리얼, 프로그래밍 교육】
위 내용은 골랑곱이란 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!