kurumi-bioの雑記帳

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

初心者のGo言語 その11 <fmt.AppendとAppendf、Appendln>

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

環境

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

初めに

fmt.Append系の機能を試してみます。この機能は、go1.19から追加されています。
また、説明部分(引用)は、英語の説明文をGoogle翻訳を使って日本語にしています。

fmt.Append

func Append(b []byte, a ...any) []byte

オペランドの既定の形式を使用して形式を追加し、結果をバイト スライスに追加して、更新されたスライスを返します。

まず、オペランドに数値を指定して、どんな結果が返ってくるのか試してみます。

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

package main

import "fmt"

func main() {
    b1 := []byte{1, 2}
    b2 := fmt.Append(b1, 3, 4)

    fmt.Printf("b1=%d / b2=%d\n", b1, b2)
}

<実行結果>

b1変数に3と4を追加してb2変数に代入したのですが、51 32 52 が追加されていました。 この数値は何かなと思ったのですが、「既定の形式」と説明に記載されているので、 文字として扱ってbyte型にしていると思われます。

試しに値が51 32 52のbyte型の変数をstringにするプログラムを作成し、
実行してみます。
<サンプルコード>AppendSampleK1.go

package main

import "fmt"

func main() {
    b51 := []byte{51}
    b32 := []byte{32}
    b52 := []byte{52}

    fmt.Printf("b51=[%s] / b32=[%s] / b52=[%s]\n", string(b51), string(b32), string(b52))
}

<実行結果>

文字の"3"と"4"、そして間に半角空白があることがわかりました。
Go言語では文字列をUTF-8で扱うので、各文字のUTF-8文字コードになっています。

では、文字、数値、真偽を追加すると、どうなるでしょうか。
<サンプルコード>AppendSampleK2.go1

package main

import "fmt"

func main() {
    b1 := []byte("あいう")
    b2 := fmt.Append(b1, "えお", 1, true, 2)

    fmt.Printf("[数値] b1=%d\n[文字] b1=%s\n", b1, b1)
    fmt.Printf("[数値] b2=%d\n[文字] b2=%s\n", b2, b2)

}

<実行結果>

それぞれの型がデフォルトの書式設定で追加されていることがわかります。 また、trueの前後に空白があるのは、
Sprintと同じ仕様で前後が文字列以外なので空白が追加されていると考えられます。

fmt.Appendf

func Appendf(b []byte, format string, a ...any) []byte

Appendf は、フォーマット指定子に従ってフォーマットし、結果をバイト スライスに追加して、更新されたスライスを返します。

書式設定が指定可能ですので、15を10進数、16進数、2進数に変換して、スライスに追加してどうなるか試してみます。

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

package main

import "fmt"

func main() {
    b1 := []byte("あいう")
    b2 := fmt.Appendf(b1, "%s %d %x %b", "def", 15, 15, 15)
    fmt.Println(string(b2))
}

<実行結果>

指定した書式設定になっていることが確認できました。 半角空白が追加されるのは、fmt.Appendと同じです。

fmt.Appendln

func Appendln(b []byte, a ...any) []byte

オペランドの既定の形式を使用して Appendln 形式を設定し、結果をバイト スライスに追加して、更新されたスライスを返します。オペランドの間には常にスペースが追加され、改行が追加されます。

fmt.Appendとの違いがわかるように、同じオペランドを使用して実行してみます。

package main

import "fmt"

func main() {
    b1 := []byte("あいう")
    b2 := fmt.Appendln(b1, "d", "e", "f", 15, 15, 15)
    b3 := fmt.Append(b1, "d", "e", "f", 15, 15, 15)
    fmt.Printf("Appendln=[%s]", string(b2))
    fmt.Printf("Append=[%s]", string(b3))
}

<実行結果>

fmt.Appendと異なり、"d"と"e"と"f"の間に半角空白が、 最後に改行が、
それぞれ追加されました。

終わりに

まだ、Go言語の半角空白が追加される仕様に慣れないです。


  1. ソースコードに日本語を含む場合は、文字コードUTF-8にして保存してください