-
[Golang] fmt print언어/Golang 2016. 11. 11. 14:01
go에서 표준출력 및 입력을 하기 위해선 fmt라는 패키지를 사용해야 합니다. 기능에 따라 여러 print이 존재하여 처음 접하면 어느 것을 사용할 지 햇갈립니다. 또한 데이터를 출력 및 받고자 할 때 데이터 타입에 따라 사용해야 하는 포맷이 다르기 때문에 확인을 하고 사용해야 합니다.
fmt.Fprint (OS)
print 앞에 F가 붙으면 파일 입출력에 해당합니다. fprint는 파일에 쓰는 용도입니다.
func Fprint, Fprintf, Fprintln
문법
/* Fprint */ // Fprint가 여러번 호출되도 한 줄로 이어서 파일에 쓰임 fmt.Fprint(파일, 파일에쓰고자 하는 데이터) /* Fprintln */ // Fprintln 여러번 호출될 때마다 마지막 줄에 줄넘김 (CRLF)가 추가됨 fmt.Fprintln(파일, 파일에쓰고자 하는 데이터) /* Fprintf */ // Fprintf가 호출될 때마다 사용자가 추가한 구분자로 구분 fmt.Fprintf(파일, 구분자,파일에쓰고자 하는 데이터)
예제
package main import ( "os" "fmt" ) func main ( file1, _ := os.Create("test.txt") defer file1.Close() sep := "|" for _, row := range rows { fmt.Fprint(file1, row) fmt.Fprintln(file1, row) fmt.Fprintf(file1, sep, row) } )
fmt.Print (표준출력)
일반적으로 많이 사용하는 print에 대한 출력입니다.
func Print, Printf, Println
문법
/* Print */ // Print가 여러번 호출되도 한 줄로 이어서 출력 fmt.Print(출력하고자 하는 데이터) /* Println */ // Println가 여러번 호출되면 다음 줄에 출력 fmt.Println(출력하고자 하는 데이터) /* Printf */ // Printf가 호출될 때마다 사용자가 추가한 포맷에 해당하여 입력된 변수값을 byte로 int타입으로 출력 fmt.Printf(포맷, 출력하고자 하는 데이터)
예제
package main import ( "fmt" ) func main() { tmp := "test" fmt.Println("1") fmt.Println("2") fmt.Print("3") fmt.Print("4", tmp, "\n") fmt.Println("5"+" 34343"+" 1") fmt.Printf("%s",tmp) } // 결과 1 2 34test 5 34343 1 test
fmt.Sprint
사용법은 fmt.Print와 같지만 해당 문법을 사용하면 표준출력을 하진 않습니다. 해당 문법을 사용하는 경우는 출력되는 값을 string 타입으로 return할 때 사용됩니다.
문법
/* Sprint */ // Sprint 리턴할 때 맨 뒤에 \n 없이 리턴되도록 fmt.Sprint(출력(리턴)하고자 하는 데이터) /* Sprintln */ // Sprintln 리턴할 때 맨 뒤에 \n을 붙여서 리턴되도록 fmt.Sprintln(출력(리턴)하고자 하는 데이터) /* Sprintf */ // Sprintf가 호출될 때마다 사용자가 추가한 포맷에 해당하여 입력된 변수값을 string 타입으로 출력 fmt.Printf(포맷, 출력하고자 하는 데이터)
예제
package main import ( "fmt" ) func test() string { tmp := "test()" tmp1 := 123 return fmt.Sprintf("%s, %d", tmp, tmp1) } func main() { tmp := test() fmt.Println(tmp) } // 결과 test(), 123
Sprint와 Print의 차이점
먼저 리턴되는 타입이 다르다고 볼 수 있습니다. Sprint는 string 타입으로 리턴되며 Print나 Fprint의 경우 바이트를 int 타입으로 리턴합니다.
package main import ( "fmt" "reflect" ) func test() string { tmp := "test()" tmp1 := 123 return fmt.Sprintf("%s, %d", tmp, tmp1) } func main() { tmp := test() tmp2,_ := fmt.Printf("%s","test(), 123") fmt.Println(tmp2) fmt.Println(reflect.TypeOf(tmp)) fmt.Println(reflect.TypeOf(tmp2)) } // 결과 test(), 12311 string int
Sprintf의 리턴으로 받은 값은 string타입이고 Printf의 리턴으로 받은 값은 int입니다. 또한 특이한 점은 Printf의 값을 받아 다시 표준출력으로 실행하면 입력받은 값과 해당 값에 대한 길이를 같이 보여줍니다.
다음으로 차이점은 표준출력이 되냐 안되냐의 차이입니다. Print는 표준출력으로 가능하기 때문에 보이지만 Sprint의 경우 표준출력이 불가능합니다.
package main import ( "fmt" ) func main() { fmt.Sprintln("test") } // 결과없음
Sprint는 반드시 string으로 리턴 되어야 하는 값에서만 사용하도록 해야 합니다.
printf 포맷
printf의 경우 받는 인자값에 해당하는 포맷을 사용해야 합니다. 아래 예시와 결과를 각 표시했으니 필요한 부분을 검색해 사용하면 됩니다.
package main
import (
"fmt"
)
type point struct {
x,y int
}
func main() {
p :=point{1,2}
fmt.Printf("%v", p)
// {1 2}
fmt.Printf("%+v\n", p)
// {1 2}{x:1 y:2}
fmt.Printf("%#v\n", p)
// main.point{x:1, y:2}
fmt.Printf("%T\n", p)
// main.point
fmt.Printf("%t\n", true)
// true
fmt.Printf("%d\n", 123)
// 123
fmt.Printf("%b\n", 14)
// 1110
fmt.Printf("%c\n", 33)
// !
fmt.Printf("%x\n", 456)
// 1c8
fmt.Printf("%f\n", 78.9)
// 78.900000
fmt.Printf("%e\n", 123400000.0)
// 1.234000e+08
fmt.Printf("%E\n", 123400000.0)
// 1.234000E+08
fmt.Printf("%s\n", "\"string\"")
// "string"
fmt.Printf("%q\n", "\"string\"")
// "\"string\""
fmt.Printf("%x\n", "hex this")
// 6865782074686973
fmt.Printf("%p\n", &p)
// 0x1040e0f8
fmt.Printf("%d\n",&p)
// &{1 2}
}