kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

初心者のGo言語 その7 <fmt.FprintとFprintln、Fprintf>

こんにちは、kurumi-bioです。9回目のブログです。
Go言語について発信します。

環境

OSバージョン:Windows11 Home 22H2
Go言語のバージョン:go version go1.19.4 windows/amd64

初めに

今回も、fmtパッケージの機能を調査します。

fmt.Fprint

func Fprint(w io.Writer, a ...any) (n int, err error)

デフォルトの書式設定で、オペランドをio.Writerに出力します。 前後のオペランドが文字列でない場合、空白が挿入されます。 戻り値は出力バイト数とエラー内容です。

<サンプルコード>FprintSample.go

package main

import "fmt"
import "os"

func main() {
    f, e := os.OpenFile("fprint.txt",os.O_CREATE, 0666)
    if e != nil {
        fmt.Fprintf(os.Stderr,"Open Error: %v\n", e)
    }
    _, e = fmt.Fprint(f,"Fprint1","Fprint2",1,2,3,"Fprint3\n","Fprint4")
    if e != nil {
        fmt.Fprintf(os.Stderr,"Fprint Error: %v\n", e)
    }
    f.Close()
}

<実行結果>

4番目のオペランド(2)は、数値で挟まれているため空白が挿入されています。

fmt.Fprintln

func Fprintln(w io.Writer, a ...any) (n int, err error)

デフォルトの書式設定で、オペランドをio.Writerに出力します。 オペランドの間と改行の後には、必ず空白が挿入されます。 戻り値は出力バイト数とエラー内容です。

<サンプルコード>FprintlnSample.go

package main

import "fmt"
import "os"

func main() {
    f, e := os.OpenFile("fprintln.txt",os.O_CREATE, 0666)
    if e != nil {
        fmt.Fprintf(os.Stderr,"Open Error: %v\n",e)
    }
    _, e = fmt.Fprintln(f,"Fprintln1","Fprintln2",1,2,3,"Fprintln3\n","Fprintln4")
    if e != nil {
        fmt.Fprintf(os.Stderr,"Fprintln Error: %v\n", e)
    }
    f.Close()
}

<実行結果>

Fprintと異なり、全オペランドの間に空白が挿入されています。 7番目のオペランド("Fprintln4")は、改行後に空白が挿入されています。

fmt.Fprintf

func Fprintf(w io.Writer, format string, a ...any) (n int, err error)

指定した書式設定で、オペランドをio.Writerに出力します。 戻り値は出力バイト数とエラー内容です。

<サンプルコード>FprintfSample.go

package main

import "fmt"
import "os"

func main() {
    f, e := os.OpenFile("Fprintf.txt", os.O_CREATE, 0666)
    if e != nil {
        fmt.Fprintf(os.Stderr, "Open Error: %v\n", e)
    }
    _, e = fmt.Fprintf(f,"%s%s%d%d%d%s\n%s", "Fprintf1","Fprintf2",1,2,3,"Fprintf3","Fprintf4")
    if e != nil {
        fmt.Fprintf(os.Stderr, "Fprintf Error: %v\n", e)
    }
    f.Close()
}

<実行結果>

指定した書式設定で出力されています。

終わりに

FprintとFprintlnで空白挿入のルールが違うのは、何か意味があるのかと思いますが、現時点では謎です。 標準ライブラリーを調べて謎が解けることを期待しています。 次回は、ファイル読み込みを試してみたいと思います。