2013-10-24 3 views
1

키보드에서 입력을 읽거나 한 번에 한 줄씩 파이프 입력 파일에서 읽을 수있는 함수를 작성하려고합니다. 이미이 테스트 코드에서 prompt() 유사한 키보드 입력을받는 함수가 있습니다go 키보드 또는 파이프 파일 입력

package main 

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

func print(format string, a ...interface{}) { 
    fmt.Printf(format+"\n", a...) 
} 

func prompt(format string) string { 
    fmt.Print(format) 
    in := bufio.NewScanner(os.Stdin) 
    in.Scan() 
    return in.Text() 
} 

func greet() { 
    name := prompt("enter name: ") 
    print(`Hello %s!`, name) 
} 

func humor() { 
    color := prompt("enter favorite color: ") 
    print(`I like %s too!`, color) 
} 

func main() { 
    greet() 
    humor() 
} 
여기

, greet()humor()가 모두 입력을 얻을 수 prompt()를 사용을, 나는 응답에서 프로그램 및 유형을 실행하는 경우, 그것을 예상대로 작동합니다. 다음

bobby bill 
soft, blue-ish turquoise 

실행 : I 파일 a.txt있는 경우에는 .\test< a.txt을, 프로그램의 출력 :

enter name: Hello bobby bill! 
enter favorite color: I like too! 

대신 :

enter name: Hello bobby bill! 
enter favorite color: I like soft, blue-ish turquoise too! 

내가 알고있는 것처럼,이 greet()에서 만든 bufio.Scanner은 모두 a.txt입니다. 나는 bufio.Scanner을 전역 변수로 만들어이 문제를 쉽게 해결할 수 있으며, prompt()은 매번 새로운 bufio.Scanner을 생성하는 대신에이를 사용하지만 전역 변수를 사용하지 않고이 작업을 수행하는 것이 더 좋은지 궁금하다.

답변

1

분석 결과가 정확하고 문제가있는 경우 bufio.Scanner은 텍스트 줄 이상을 버퍼링하므로 버릴 때 그 입력을 잃을 수 있습니다. 버퍼링 된 입력을 사용하려는 경우 이러한 종류의 문제를 피하기 위해 모든 것이 동일한 버퍼를 사용해야합니다.

전역 변수를 사용하는 것이 하나의 해결책입니다. 또 다른 유형은 bufio.Scanner을 보유 할 유형을 작성하고 일부 기능을 메소드로 변환하는 것입니다.

1

나는 os.Stdin이 전역 변수이므로 전역 버퍼링 버전을 사용하는 것이 전적으로 적합하다고 말할 수 있습니다. 이동이 진정한 글로벌 변수가 발생하지 않는 것을

주 - 모든 패키지 네임 스페이스 그래서 전역 변수를 만드는 항상 같은 C.

같은 언어로 확실히 그렇게 큰 거래를하다
package main 

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

// Globals 
var (
    in = bufio.NewScanner(os.Stdin) 
) 

func prompt(format string) string { 
    fmt.Print(format) 
    in.Scan() 
    return in.Text() 
} 

func greet() { 
    name := prompt("enter name: ") 
    fmt.Printf("Hello %s!\n", name) 
} 

func humor() { 
    color := prompt("enter favorite color: ") 
    fmt.Printf("I like %s too!\n", color) 
} 

func main() { 
    greet() 
    humor() 
}