이 글은 Tucker의 Go언어 프로그래밍의 fmt 패키지를 이용한 텍스트 입출력를 공부보고 정리한내용이다.
fmt 패키지
fmt 패키지는 구조화된 입출력을 제공하는 패키지이다. Print(),Printf(),Println() 함수를 이용하여 표준 출력을 할수 있고, Scan(),Scanf(),Scanln() 함수를 이용하여 값을 입력받을수 있다.
import "fmt"
Go언어는 기본 패키지인 fmt를 통해 표준 입출력 기능을 제공한다. 패키지를 사용하려면 import를 통해 사용할 패키지를 불러온다.
package main
import "fmt"
func main(){
var a = 123
fmt.Printf("%d",a)
}
서식 문자는 Printf(),Scanf()에서 사용을 한다. 첫 번째 인수로는 서식이오고, 두 번째 인수부터는 서식에 맞춰 출력할 값들을 넣어서 값을 출력한다. 보통 정수는 %d, 실수는 %f, 문자열은 %s를 사용하고, 어떤 서식인지 알수 없을때는 %v를 사용한다.
타입을 출력하고 싶을때는 %T를 이용한다.
package main
import "fmt"
func main() {
var a = 123
var b = 456
var c = 123456789
fmt.Printf("%5d, %5d\n", a, b)
fmt.Printf("%05d, %05d\n", a, b)
fmt.Printf("%-5d, %-5d\n", a, b)
fmt.Printf("%5d, %5d\n", c, c)
fmt.Printf("%05d, %05d\n", c, c)
fmt.Printf("%-5d, %-5d\n", c, c)
}
서식 문자를 이용하면 출력 너비를 지정하고, 숫자 0으로 빈칸을 채우고, 왼쪽 정렬을 할수 있다.
-> %5.2f : 최소너비 5칸이고 소수점 이하 값 2개를 출력한다.
-> %5.3g : 최소너비 5칸에 소수점 이하 포함 총 숫자 3개로 표현한다. (기본 숫자 길이 6)
표준 입력에서 값을 입력 받는다.
package main
import "fmt"
func main() {
var a int
var b int
n, err := fmt.Scan(&a, &b) // a,b 주소를 입력으로 넘겨야함
if err != nil {
fmt.Println(n, err)
} else {
fmt.Println(n, a, b)
}
}
표준 입력에서 서식 형태로 값을 입력 받는다.
package main
import "fmt"
func main() {
var a int
var b int
n, err := fmt.Scanf("%d %d\n", &a, &b)
if err != nil {
fmt.Println(n, err)
} else {
fmt.Println(n, a, b)
}
}
표준 입력에서 한 줄을 읽어서 값을 입력 받는다.
package main
import "fmt"
func main() {
var a int
var b int
n, err := fmt.Scanln(&a, &b)
if err != nil {
fmt.Println(n, err)
} else {
fmt.Println(n, a, b)
}
}
Scan 함수와 Scanln 함수의 차이점은 Scan 함수는 공백이나 개행을 기준으로 변환을 하지만 Scanln은 공백만을 기준으로 변환하며 개행을 만나면 입력 완료로 인지하여 변환 후 결과를 반환한다.
데이터는 컴퓨터 내부의 표준입출력 스트림에 저장된다. 표준 입출력 스트림의 구조는 FIFO 구조이다. Scan() 함수는 스트림에서 가장 먼저 입력된 글자를 먼저 읽는다. 한 번 읽은 데이터는 다시 읽어올수 없기때문에 스트림을 비워주어야한다.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
stdin := bufio.NewReader(os.Stdin) // 표준 입력 스트림 읽는 객체
var a int
var b int
n, err := fmt.Scanln(&a, &b)
if err != nil {
fmt.Println(err)
stdin.ReadString('\n') // 표준 입력 스트림 지우기
} else {
fmt.Println(n, a, b)
}
n, err = fmt.Scanln(&a, &b)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(n, a, b)
}
}
참고