[] 문자열을 [] 바이트로 변환

jimjampez :

GO에서 문자열 배열을 바이트 배열로 변환하여 디스크에 기록 할 수 있도록하려고합니다. 문자열 배열 ( []string)을 바이트 배열 ( []byte) 로 인코딩하고 디코딩하는 최적의 솔루션은 무엇입니까 ?

문자열 배열을 두 번 반복하려고 생각했습니다. 첫 번째는 바이트 배열에 필요한 실제 크기를 가져오고 두 번째 []byte(str)는 각 요소 의 길이와 실제 문자열 ( ) 을 작성하는 것 입니다.

솔루션은 다른 방향으로 변환 할 수 있어야합니다. A로부터 []byteA와 []string.

Stephen Weinberg :

이것이 Go라는 사실을 잠시 무시합시다. 가장 먼저 필요한 것은 마샬링 할 직렬화 형식 []string입니다.

여기에는 많은 옵션이 있습니다. 직접 만들거나 라이브러리를 사용할 수 있습니다. 나는 당신이 직접 빌드하고 직렬화 형식으로 이동하는 것을 원하지 않는다고 가정하고 지원합니다.

모든 예에서 data는 []string이고 fp는 읽고 쓰는 파일입니다. 오류는 무시됩니다. 오류를 처리하는 함수의 반환을 확인하십시오.

덩어리

Gob은 이동 전용 바이너리 형식입니다. 문자열 수가 증가함에 따라 상대적으로 공간 효율적이어야합니다.

enc := gob.NewEncoder(fp)
enc.Encode(data)

읽기도 간단합니다

var data []string
dec := gob.NewDecoder(fp)
dec.Decode(&data)

Gob은 간단하고 요점입니다. 그러나 형식은 다른 Go 코드로만 읽을 수 있습니다.

Json

다음은 json입니다. Json은 거의 모든 곳에서 사용되는 형식입니다. 이 형식은 사용하기 쉽습니다.

enc := json.NewEncoder(fp)
enc.Encode(data)

그리고 읽기 :

var data []string
dec := json.NewDecoder(fp)
dec.Decode(&data)

XML

XML은 또 다른 일반적인 형식입니다. 그러나 오버 헤드가 꽤 높고 사용하기 쉽지 않습니다. gob 및 json에 대해했던 것과 동일하게 할 수 있지만 적절한 xml에는 루트 태그가 필요합니다. 이 경우 루트 태그 "Strings"를 사용하고 각 문자열은 "S"태그로 래핑됩니다.

type Strings struct {
    S []string
}

enc := xml.NewEncoder(fp)
enc.Encode(Strings{data})

var x Strings
dec := xml.NewDecoder(fp)
dec.Decode(&x)
data := x.S

CSV

CSV는 다른 것과 다릅니다. 두 가지 옵션이 있습니다. n 개의 행이있는 하나의 레코드 또는 1 개의 행이있는 n 개의 레코드를 사용합니다. 다음 예에서는 n 개의 레코드를 사용합니다. 하나의 레코드를 사용하면 지루할 것입니다. 다른 사람들과 너무 비슷해 보일 것입니다. CSV는 문자열 만 포함 할 수 있습니다.

enc := csv.NewWriter(fp)
for _, v := range data {
    enc.Write([]string{v})
}
enc.Flush()

읽다:

var err error
var data string
dec := csv.NewReader(fp)
for err == nil {        // reading ends when an error is reached (perhaps io.EOF)
    var s []string

    s, err = dec.Read()
    if len(s) > 0 {
        data = append(data, s[0])
    }
}

사용하는 형식은 선호도의 문제입니다. 내가 언급하지 않은 다른 가능한 인코딩이 많이 있습니다. 예를 들어 bencode라는 외부 라이브러리가 있습니다. 나는 개인적으로 bencode를 좋아하지 않지만 작동합니다. bittorrent 메타 데이터 파일에서 사용하는 것과 동일한 인코딩입니다.

자신 만의 인코딩을 만들고 싶다면 인코딩 / 바이너리가 좋은 시작점입니다. 이렇게하면 가능한 가장 압축 된 파일을 만들 수 있지만 노력할만한 가치는 거의 없습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관