>백엔드 개발 >Golang >`fmt.Fscan()`을 사용하여 Go 슬라이스에서 여러 숫자를 효율적으로 읽으려면 어떻게 해야 합니까?

`fmt.Fscan()`을 사용하여 Go 슬라이스에서 여러 숫자를 효율적으로 읽으려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-11-25 06:44:151020검색

How Can I Efficiently Read Multiple Numbers into a Go Slice Using `fmt.Fscan()`?

Go의 표준 입력에서 숫자 구문 분석

Go에서는 개발자가 여러 숫자 입력을 사용하여 여러 변수를 사용하여 개별 값을 캡처할 수 있습니다. 하지만 이 프로세스를 단순화하고 모든 숫자를 단일 배열이나 슬라이스에 저장하려면 어떻게 해야 할까요?

다음 코드 조각을 고려하세요.

numbers := make([]int, 2)
fmt.Fscan(os.Stdin, &numbers[0], &numbers[1])

이 코드는 두 숫자를 효율적으로 읽고 저장합니다. 숫자 조각에 표시됩니다. 그러나 입력 수가 많은 경우 이 접근 방식은 장황해질 수 있습니다.

fmt.Fscan()을 사용하여 숫자를 슬라이스로 직접 읽을 수 있습니까?

불행하게도 fmt 패키지는 기본적으로 슬라이스 스캔을 지원하지 않습니다. 이러한 제한을 극복하기 위해 모든 슬라이스 요소의 주소를 인터페이스 배열로 압축하는 사용자 정의 유틸리티 함수를 생성할 수 있습니다.

func packAddrs(n []int) []interface{} {
    p := make([]interface{}, len(n))
    for i := range n {
        p[i] = &n[i]
    }
    return p
}

이 함수는 슬라이스를 반복하여 각 요소에 대한 포인터 배열을 생성합니다. .

packAddrs() 함수를 사용하여 슬라이스로 스캔

packAddrs() 함수를 사용하면 이제 다음과 같이 슬라이스로 스캔할 수 있습니다.

numbers := make([]int, 2)
n, err := fmt.Fscan(os.Stdin, packAddrs(numbers)...)
fmt.Println(numbers, n, err)

packAddrs() 함수는 슬라이스를 인터페이스 배열로 변환하여 fmt.Fscan()이 각 요소를 스캔할 수 있도록 합니다.

fmt.Sscan()을 사용하는 예 테스트

numbers := make([]int, 5)
n, err := fmt.Sscan("1 3 5 7 9", packAddrs(numbers)...)
fmt.Println(numbers, n, err)

이 예에서는 fmt.Sscan()을 사용하여 코드를 테스트하고 있습니다. 문자열을 입력으로 사용하고 스캔된 값을 반환합니다. 이 코드의 출력은 다음과 같습니다.

[1 3 5 7 9] 5 <nil>

이는 packAddrs() 유틸리티 함수를 사용하여 여러 숫자를 슬라이스로 효율적으로 읽을 수 있는 방법을 보여줍니다.

위 내용은 `fmt.Fscan()`을 사용하여 Go 슬라이스에서 여러 숫자를 효율적으로 읽으려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.