【Golang】Print系関数の違い

# 出力系関数の違い

## fmtパッケージに含まれるPrint系関数
golangを勉強している中で文字列を出力する関数を調べた所、標準パッケージに複数種類含まれていることがわかった。
まだまだ初心者の自分ではどの関数が今書いているコードに適切な関数か調べる必要があったため、自分の備忘録も含めて記事にしようと思う。

:::note warn
警告
下記まとめ内容は、公式ドキュメントをもとに書き出したものです。
詳細については、各段落記載の公式ドキュメントをご参照ください。
:::

## 全体像
Print系関数についてしらべたところ、ざっくりと下記種類が存在していた。
後述にて、それぞれの関数について記載する。
```go:Golang:fmtパッケージ
// (1)標準出力へ出力する関数
func Print(a ...any) (n int, err error)
func Printf(format string, a ...any) (n int, err error)
func Println(a ...any) (n int, err error)

// (2)書き込み先を明示的に指定
func Fprint(w io.Writer, a ...any) (n int, err error)
func Fprintf(w io.Writer, format string, a ...any) (n int, err error)
func Fprintln(w io.Writer, a ...any) (n int, err error)

// (3)文字列へ出力する関数
func Sprint(a ...any) string
func Sprintf(format string, a ...any) string
func Sprintln(a ...any) string
```

## (1)標準出力へ出力する関数
### `func Print(a ...any) (n int, err error)`
引数に渡された文字列を、そのまま標準出力に書き出す。
返り値には、書き出したバイト数と、エラーが返却される。
公式ドキュメント: [func Print(a ...any) (n int, err error)](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Print%20%C2%B6-,func%20Print(a%20...any)%20(n%20int%2C%20err%20error),-Print%20formats%20using)


```go:example
package main

import "fmt"

func main() {
	fmt.Print("A")
	fmt.Print(" ")
	fmt.Print(1)
	fmt.Print(" ")
	fmt.Print("2\n")
	fmt.Print("345\n")
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
A 1 2
345
tomoaki@TomoakinoMacBook-Air cmd %
```

### `func Printf(format string, a ...any) (n int, err error)`
フォーマットを指定して出力することができる。
指定できるフォーマットの一例は下記の通り。
| 1 | 2 |
|:-:|:-:|
|%T |値の型 |
|%s |文字列、スライス |
|%d |基数10   |

公式ドキュメント: [func Printf(format string, a ...any) (n int, err error)](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Printf%20%C2%B6-,func%20Printf(format%20string%2C%20a%20...any)%20(n%20int%2C%20err%20error),-Printf%20formats%20according)

```go:example
package main

import "fmt"

func main() {
	fmt.Printf("Type=%T.\n", "Tom")
	fmt.Printf("My name is %s .\n", "Tom")
	fmt.Printf("I am %d years old.\n", 26)
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
Type=string.
My name is Tom .
I am 26 years old.
tomoaki@TomoakinoMacBook-Air cmd %
```

### `func Println(a ...any) (n int, err error)`
最後に改行(`\n`)を追加した文字列を出力する。
公式ドキュメント: [func Println(a ...any) (n int, err error)](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Println%20%C2%B6-,func%20Println(a%20...any)%20(n%20int%2C%20err%20error),-Println%20formats%20using)
```go:example
package main

import "fmt"

func main() {
	fmt.Println("My name is Tom.")
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
My name is Tom.
tomoaki@TomoakinoMacBook-Air cmd %
```

## (2)書き込み先を明示的に指定
### `func Fprint(w io.Writer, a ...any) (n int, err error)`
公式ドキュメント: [func Fprint(w io.Writer, a ...any) (n int, err error)](https://pkg.go.dev/io)
```go:example
package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Fprint(os.Stdout, "abc\n")
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
abc
tomoaki@TomoakinoMacBook-Air cmd %
```


### `func Fprintf(w io.Writer, format string, a ...any) (n int, err error)`
公式ドキュメント: [func Fprintf(w io.Writer, format string, a ...any) (n int, err error)](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Fprintf%20%C2%B6-,func%20Fprintf(w%20io.Writer%2C%20format%20string%2C%20a%20...any)%20(n%20int%2C%20err%20error),-Fprintf%20formats%20according)
```go:example
package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Fprintf(os.Stdout, "Type=%T.\n", "Tom")
	fmt.Fprintf(os.Stdout, "My name is %s .\n", "Tom")
	fmt.Fprintf(os.Stdout, "I am %d years old.\n", 26)
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
Type=string.
My name is Tom .
I am 26 years old.
tomoaki@TomoakinoMacBook-Air cmd %
```

### `func Fprintln(w io.Writer, a ...any) (n int, err error)`
公式ドキュメント: [func Fprintln(w io.Writer, a ...any) (n int, err error)](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Fprintln%20%C2%B6-,func%20Fprintln(w%20io.Writer%2C%20a%20...any)%20(n%20int%2C%20err%20error),-Fprintln%20formats%20using)
```go:example
package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Fprintln(os.Stdout, "My name is Tom.")
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
My name is Tom.
tomoaki@TomoakinoMacBook-Air cmd %
```

## (3)文字列へ出力する関数
### `func Sprint(a ...any) string`
公式ドキュメント: [func Sprint(a ...any) string](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Sprint%20%C2%B6-,func%20Sprint(a%20...any)%20string,-Sprint%20formats%20using)
```go:example
package main

import "fmt"

func main() {
	string := fmt.Sprint("A")
	int := fmt.Sprint(1)

	fmt.Printf("%T\n", string)
	fmt.Printf("%T\n", int)
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
string
string
tomoaki@TomoakinoMacBook-Air cmd % 
```

### `func Sprintf(format string, a ...any) string`
公式ドキュメント: [func Sprintf(format string, a ...any) string](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Sprintf%20%C2%B6-,func%20Sprintf(format%20string%2C%20a%20...any)%20string,-Sprintf%20formats%20according)
```go:example
package main

import "fmt"

func main() {
	string := fmt.Sprintf("My name is %s .\n", "Tom")
	int := fmt.Sprintf("I am %d years old.\n", 26)

	fmt.Printf("%T\n", string)
	fmt.Printf("%T\n", int)
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
string
string
tomoaki@TomoakinoMacBook-Air cmd %
```

### `func Sprintln(a ...any) string`
公式ドキュメント: [func Sprintln(a ...any) string](https://pkg.go.dev/fmt#Sscanln:~:text=func%20Sprintln%20%C2%B6-,func%20Sprintln(a%20...any)%20string,-Sprintln%20formats%20using)
```go:example
package main

import "fmt"

func main() {
	string := fmt.Sprintln("A")
	int := fmt.Sprintln(1)

	fmt.Printf("%T\n", string)
	fmt.Printf("%T\n", int)
}

Ourtput:
tomoaki@TomoakinoMacBook-Air cmd % go run main.go
string
string
tomoaki@TomoakinoMacBook-Air cmd %
```