Go에서 CRLF로 구분된 여러 줄 데이터를 읽는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-26 20:09:29
원래의
112명이 탐색했습니다.

How to Read Multi-Line Data Delimited by CRLF in Go?

Go에서 CRLF로 구분된 여러 줄 데이터 읽기

다줄 메시지를 전송하는 프로토콜을 사용하는 경우 줄로 구분된 데이터를 효율적으로 처리하는 것이 필요합니다. 이 경우 구분 문자 시퀀스 CRLF가 발생할 때까지 버퍼에서 데이터를 읽는 방법에 대한 의문이 생깁니다.

사용자 정의 bufio.SplitFunc 사용

이 문제를 해결하기 위한 한 가지 해결책은 다음과 같습니다. CRLF 시퀀스를 라인 종료로 인식하는 사용자 정의 bufio.SplitFunc를 정의하십시오. 구현 예는 다음과 같습니다.

<code class="go">import (
    "bufio"
    "bytes"
)

func ScanCRLF(data []byte, atEOF bool) (advance int, token []byte, err error) {
    if atEOF && len(data) == 0 {
        return 0, nil, nil
    }
    if i := bytes.Index(data, []byte{'\r', '\n'}); i >= 0 {
        // We have a full newline-terminated line.
        return i + 2, dropCR(data[0:i]), nil
    }
    // If we're at EOF, we have a final, non-terminated line. Return it.
    if atEOF {
        return len(data), dropCR(data), nil
    }
    // Request more data.
    return 0, nil, nil
}

func dropCR(data []byte) []byte {
    if len(data) > 0 && data[len(data)-1] == '\r' {
        return data[0 : len(data)-1]
    }
    return data
}</code>
로그인 후 복사

이 ScanCRLF 기능은 CRLF 구분 기호를 기반으로 데이터를 분할하는 데 사용할 수 있습니다.

리더를 스캐너로 래핑

사용자 정의 ScanCRLF 기능을 사용하면, 원본 io.Reader를 bufio.Scanner로 래핑하여 데이터를 더 효율적으로 읽을 수 있습니다.

<code class="go">scanner := bufio.NewScanner(r)
scanner.Split(ScanCRLF)

// Read chunks of data until EOF
for scanner.Scan() {
    fmt.Printf("%s\n", scanner.Text())
}

if err := scanner.Err(); err != nil {
    fmt.Printf("Invalid input: %s", err)
}</code>
로그인 후 복사

예기치 않은 바이트 카운터 처리

다음을 기반으로 특정 바이트 수를 읽는 대안 제안 바이트 카운터는 카운터 자체의 잠재적인 오류로 인해 신뢰할 수 없을 수 있습니다. 카운터의 예상치 못한 값이나 잘못된 값은 데이터 손상이나 메시지 잘림으로 이어질 수 있습니다.

따라서 선호되는 접근 방식은 상태 시스템과 유사한 메커니즘을 사용하여 명령 및 예상 본문 길이를 포함하여 프로토콜을 구문 분석하는 것입니다. 이 예상 값과 비교하여 실제 신체 길이를 확인합니다. 이는 데이터 무결성과 견고성을 보장합니다.

위 내용은 Go에서 CRLF로 구분된 여러 줄 데이터를 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!