Go 사항 시작: 표준 입력

소름 끼치는 Go에 관심이 있었지만, 스칼라에서는 컬렉션 조작의 편안함을 배웠고, nodejs의 http 팟캐스트의 단순함에 놀라움과 기쁨을 느꼈다.오늘 이맘때면 소장 조작이 전혀 없는 http 팟캐스트를 배우는 데 상당히 많은 줄이 필요한 Go를 배우는 것이 귀찮아진다.
열심히 공부하고 있습니다.
따라서 이번에는 표준 입력으로 데이터를 읽고 어쨌든 처리하여 표준 출력으로 출력한다
이런 프로그램을 만들려고 어렵게 Go로 해봤어요.

우선 os포장을 조사했습니다.


먼저 문서를 찾아보세요.
확실히 Go는 os라는 포장이 있을 거야...
역시 표준 입력과 출력은 os포장이죠.
그래서 Golang os에서 검색했습니다.
공식 문서 안전하게 발견된 후 stdin에서 페이지를 검색합니다.
오, 역시 있네요.

근데 이거 어떻게 읽는 거예요?

os.Stdin는 포장에서 Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")로 정의되었다.
즉, File 유형으로 File 인터페이스의 링크를 확인하는 방법입니다.
fmfm, func (f *File) Read(b []byte) (n int, err error) 등등.
일단 해봐.
stdin.go
package main

import (
    "os"
    "fmt"
)
func main() {
    buf := []byte{}
    n, _ := os.Stdin.Read(buf)
    fmt.Println("Read", n, "lines")
    fmt.Println("Buf", string(buf))
}
$ echo "hello world!" | go run stdin.go
Read 0 lines
Buf
...응?
$ echo "hello?" | go run stdin.go
Read 0 lines
Buf
아, 아니야...의

Golang stdin으로 찾아봤어요.


한 방 쏘았다
stdin.go
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    stdin := bufio.NewScanner(os.Stdin)
    for stdin.Scan() {
        if err := stdin.Err(); err != nil {
            fmt.Fprintln(os.Stderr, err)
        }
        fmt.Println(stdin.Text())
    }
}
공식 문서를 엿보다로 정의func NewScanner(r io.Reader) *Scanner...응?
io.Reader?
하지만 납품된 것은os.Stdin, 이것은File 유형이다.
그리고 Go는 물려받지 않은 것 같은데...
이거 뭐야?

인터페이스의 편리성을 알 것 같아.


io.Reader의 정의는 다음과 같습니다훔쳐보다.
io.Reader
type Reader interface {
        Read(p []byte) (n int, err error)
}
응?이거 방금 봤어요?
중형 File조사해 보았다도 있습니다.
File.Read
func (f *File) Read(b []byte) (n int, err error)
아, 같은 방법을 정의했기 때문에 정의가 아니더라도io를 사용할 수 있습니다.Reader와 호환 가능
활용할 수 있을지 없을지는 말하지 않고 받아들이자

그나저나 (s*Scanner).Scan()은 각 행에 대한 읽기 작업을 수행합니다.

(s *Scanner).Text() 현재 버퍼의 문자열만 되돌려주고 (s *Scanner).Scan() 버퍼의 내용을 다음 줄로 업데이트해야 합니다.
반대로 (s *Scanner).Text()는 반드시 같은 값을 되돌려주기 때문에 변수에 저장하지 않고 gan이라고 할 수 있다.(어느 정도 횟수가 있는 경우 편의를 위해 변수에 저장하는 것이 좋다)(이후 성능에 있어서는 어떻게 될지 모른다)

좋은 웹페이지 즐겨찾기