>  기사  >  백엔드 개발  >  Go에서는 io.Reader만 허용해야 한다고 정의되어 있는데 bufio.NewScanner에서 *os.File을 매개변수로 사용할 수 있는 이유는 무엇입니까?

Go에서는 io.Reader만 허용해야 한다고 정의되어 있는데 bufio.NewScanner에서 *os.File을 매개변수로 사용할 수 있는 이유는 무엇입니까?

王林
王林앞으로
2024-02-08 23:39:32554검색

在 Go 中,当定义表明它应该只接受 io.Reader 时,为什么我们可以在 bufio.NewScanner 中使用 *os.File 作为参数?

Go 언어에서는 io.Reader로 매개변수 유형을 수신하는 함수나 메소드를 정의하면 실제로 io.Reader 인터페이스를 구현하는 모든 유형을 허용할 수 있습니다. 따라서 bufio.NewScanner에서 os.File을 매개변수로 사용하는 것은 os.File 유형이 io.Reader 인터페이스를 구현하기 때문입니다. 이는 os.File 유형이 io.Reader 유형을 허용하는 함수 또는 메소드에 매개변수로 전달될 수 있고, io.Reader 메소드가 os.File에 대해 작동하기 위해 함수 또는 메소드 내에서 사용될 수 있음을 의미합니다. 이러한 유연성은 Go 언어의 인터페이스 기능을 반영하여 코드를 더욱 간결하고 재사용 가능하게 만듭니다. 따라서 매개변수 유형이 io.Reader로 선언된 경우에도 bufio.NewScanner에 전달된 매개변수로 os.File을 계속 사용할 수 있습니다.

질문 내용

go를 배우고 bufio.newscanner를 계속 사용하여 파일 내용을 읽으세요. 이를 위해 다음 코드를 사용합니다:

으아악

정의를 보고 (적어도 나에게는) 이상한 점을 발견할 것이라고 생각했는데, 위의 os.open("input.txt")는 실제로 *os .file을 반환합니다. code> 및 os.open("input.txt") 实际上返回一个 *os.filebufio.newscanner 期望一个 io。 reader作为参数。 reader 是一个接口,而 file io를 기대합니다. reader를 매개변수로 사용합니다. reader는 인터페이스인 반면, file은 해당 인터페이스나 그와 유사한 것(가능한 경우)을 구현하지 않는 구조체입니다.

근데 완전 괜찮은 것 같네요. go 작동 방식에 대해 뭔가 빠졌나요? 저는 C#에 대한 배경 지식이 있고 매개 변수의 유형이 다르기 때문에 컴파일러가 이를 허용해서는 안 되는 것 같습니다. 그렇죠?

그냥 궁금해서 이 질문을 어디에 물어야 할지 모르겠어요.

Workaround

os.file은 실제로 io.reader 인터페이스를 구현하고 있습니다.

즉, io.reader 인터페이스에서 제공하는 모든 메소드를 동일한 서명으로 구현한다는 의미입니다.

이 특별한 경우에는 다음 방법을 사용하세요.

으아악

위 내용은 Go에서는 io.Reader만 허용해야 한다고 정의되어 있는데 bufio.NewScanner에서 *os.File을 매개변수로 사용할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제