[go] Go 언어에서의 인코딩 관련 디자인 패턴
Go 언어에서는 UTF-8 인코딩을 기본적으로 지원하며, 데이터의 인코딩과 디코딩에 관련된 다양한 디자인 패턴을 활용할 수 있습니다. 이러한 디자인 패턴은 데이터의 안전한 처리, 네트워크 통신, 파일 입출력 등 다양한 상황에서 유용하게 활용될 수 있습니다.
1. 문자열과 바이트 슬라이스 변환
Go 언어에서 문자열은 UTF-8로 인코딩되어 있고, string
타입과 []byte
타입 사이에 변환을 하는 것이 중요합니다.
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "안녕하세요"
bytes := []byte(str)
fmt.Println("Length of string:", len(str))
fmt.Println("Length of bytes:", len(bytes))
fmt.Println("Rune count:", utf8.RuneCountInString(str))
}
2. JSON 데이터 다루기
Go 언어에서 JSON 데이터를 다룰 때, 데이터의 인코딩과 디코딩을 올바르게 처리하는 것이 중요합니다. 다음은 JSON 데이터의 인코딩과 디코딩 예제입니다.
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := Person{Name: "Alice", Age: 30}
// JSON 인코딩
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))
// JSON 디코딩
var newP Person
_ = json.Unmarshal(jsonData, &newP)
fmt.Println(newP)
}
3. 네트워크 통신에서의 데이터 인코딩
Go 언어에서는 네트워크 통신에서 데이터를 주고받을 때 인코딩된 데이터를 다루는 경우가 많습니다. 특히, encoding/binary
패키지를 사용하여 바이너리 데이터를 다룰 때는 엔디안과 같은 인코딩 관련 이슈에 유의해야 합니다.
package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
var buf bytes.Buffer
data := uint32(42)
_ = binary.Write(&buf, binary.LittleEndian, data)
readData := new(uint32)
_ = binary.Read(&buf, binary.LittleEndian, readData)
fmt.Println(*readData)
}
Go 언어에서 데이터의 안전한 인코딩과 디코딩을 다루는 것은 프로그램의 안정성과 신뢰성을 높이는데 중요합니다.
참고 자료
- The Go Blog - Strings, bytes, runes and characters in Go
- The Go Blog - JSON and Go
- The Go Blog - Binary files and endianness