fmt 패키지
표준 입출력 기능은 Go 언어 기본 패키지은 fmt 에서 제공한다.
fmt 패키지는 3가지 표준 출력용 함수를 제공한다.
Print() | 함수 입력값들을 출력한다. |
Println() | 함수 입력값들을 출력하고 개행한다. |
Printf() | 서식(format)에 맞도록 입력값들을 출력한다. |
package main
import "fmt"
func main() {
var a int = 10
var b int = 20
var f float64 = 32799438743.8297
fmt.Print("a:", a, "b:", b)
fmt.Println("a:", a, "b", b, "f:", f)
fmt.Printf("a: %d b: %d f:%f\n", a, b, f)
}
Go
복사
최소 출력 너비 지정
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) // ❷ 최소 너비보다 짧은 값 0 채우기
fmt.Printf("%-5d, %-05d\n", a, b) // ❸ 최소 너비보다 짧은 값 왼쪽 정렬
fmt.Printf("%5d, %5d\n", c, c) // ➍ 최소 너비보다 긴 값 너비 지정
fmt.Printf("%05d, %05d\n", c, c) // ➎ 최소 너비보다 긴 값 0 채우기
fmt.Printf("%-5d, %-05d\n", c, c) // ➏ 최소 너비보다 긴 값 왼쪽 정렬
}
Go
복사
GUI나 웹 서버 등 다른 interface를 사용하는 app이 아니라면 기본적으로 console로 입출력이 이루어진다. go에서는 fmt 패키지를 통해 콘솔의 입출력을 처리한다.
줄바꿈 (CR, LF)
fmt.Println() 함수는 인자로 들어온 내용을 출력하고, 이후 줄바꿈을 진행한다. 이 때 줄바꿈에 대한 ASCII 코드는 플랫폼에 따라 다르다. 그런데 go에서는 compile시 알아서 해당 플랫폼에 대한 줄바꿈 ASCII 코드를 사용한다. go에서는 무조건 LF만 출력한다.
줄바꿈에 대한 ASCII 코드는 LF(Line Feed, 0x0A), CR(Carrige Return, 0x0D)가 있는데, 이는 타자기 시절의 줄바꿈 행동과 관계가 있다.
LF는 타자기의 커서 위치에서 줄(세로 방향)을 하나 아래로 내리는 행위를 의미했으며, CR은 타자기의 커서 위치를 해당 줄의 시작 부분으로 옮기는(가로 방향) 행위를 의미한다.
Go 코드실행 결과
package main
import "fmt"
func main() {
var num int = 1010;
fmt.Printf("%d %t %f %s", num, num, num, num);
}
Go
복사
보다시피 Println()을 호출할 때나, Print()에서 \n을 호출할 때나 무조건 CR LF를 출력하는 것을 확인할 수 있다.
Printf의 formatter
go는 강 타입 언어로, 명시적으로 타입 변환을 해야하는데, Printf()의 인자로 들어가는 경우에는 타입을 강제로 지정하지 않는다. (interface를 인자로 받는데, 이게 타입 검사를 강제화 하지 않는 것으로 보인다.) 억지로 type에 맞지 않는 formatter를 사용해보자.
Go 코드실행 결과
package main
import "fmt"
func main() {
var num int = 1010;
fmt.Printf("%d %t %f %s", num, num, num, num);
}
Go
복사
자체적으로 잘못된 formatter를 사용했음을 Printf()의 결과로 알린다.
입력 scan 과정의 오류
Scan() 과정에서 원하는 타입대로 입력하지 않으면 오류가 발생한다. 이때 Error 처리를 stderr로 출력하지 않고, 해당 함수의 인자로 에러 알림을 변수로 받을 수 있다.
Go 코드실행 결과
package main
import "fmt"
func main() {
var num1 int
var num2 int
fmt.Print("Enter 2 numbers: ")
n, err := fmt.Scanln(&num1, &num2)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("%d numbers entered, num1: %d, num2: %d", n, num1, num2)
}
}
Go
복사
추가적으로 fmt.Scanln()에서 return값을 할당하는 과정에서 볼 수 있듯, go에서는 함수에서 여러 값을 반환할 수 있는 것으로 보인다.
사용되지 않는 변수에 대한 오류
go에서는 선언하고 사용되지 않는 (reference되지 않는) 변수를 허용하지 않는다. fmt.Scanln()과 같이 여러 값을 반환하는 함수에서 일부 값만 사용하고, 나머지를 버리기 위해서는 _(blank identifier)를 사용하면 된다.
Go 코드 (Unref.Go)Go 코드 (Blank.Go)빌드 결과
package main
import "fmt"
func main() {
var num int = 1010;
fmt.Printf("%d %t %f %s", num, num, num, num);
}
Go
복사