ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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}
    }


    댓글