【Golang】list型の配列をカンマなど特定の区切り文字で連結する
普段、go 言語を触る機会は少ないのですが、画面への表示で配列(リスト)の中身を特定の文字列で区切って表示したいケースに遭遇しました。
PHP でいう implode のような処理ですが、Go では標準パッケージの strings.Join を使えば一発でした。
ってことで公式のドキュメントを参考にしてみます。
Join concatenates the elements of its first argument to create a single string. The separator string sep is placed between elements in the resulting string.
https://pkg.go.dev/strings#example-Join
strings.Join の基本的な使い方
strings.Join は、第 1 引数のスライスを第 2 引数の区切り文字でつなぎ、1 つの文字列にして返してくれます。
関数のシグネチャは次のとおりです。
func Join(elems []string, sep string) string
では、3 つのタグをカンマ区切りでつないでみます。
package main
import (
"fmt"
"strings"
)
func main() {
tags := []string{"go", "python", "java"}
result := strings.Join(tags, ", ")
fmt.Println(result)
}実行結果は次のとおりです。
go, python, javaポイントは、[]string のスライスはそのまま渡せることです。
以前のサンプルにあった tags[:] はスライスでは不要で、付けても付けなくても結果は変わりません。
区切り文字を変える
区切り文字は第 2 引数を変えるだけで、自由に指定できます。
スラッシュや中黒(・)でつなぐ場合は、こんな感じですね。
strings.Join(tags, " / ")
// go / python / java
strings.Join(tags, "・")
// go・python・java固定長の配列([3]string)は [:] でスライスにする
一方で、[3]string のような固定長の配列は、そのままでは strings.Join に渡せません。
その場合は [:] でスライスに変換してから渡します。
tags := [3]string{"go", "python", "java"}
result := strings.Join(tags[:], ", ")実は、冒頭のサンプルで tags[:] と書いていたのは、この配列のケースの名残だったんですね。
数値(int)のスライスを連結したいとき
strings.Join が受け取れるのは []string だけなので、[]int はそのままでは渡せません。
一度 strconv.Itoa で文字列のスライスに変換してから連結します。
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
nums := []int{1, 2, 3}
strs := make([]string, len(nums))
for i, n := range nums {
strs[i] = strconv.Itoa(n)
}
fmt.Println(strings.Join(strs, ", "))
}実行結果はこちらです。
1, 2, 3Go の標準パッケージだけで implode 相当の処理ができるので、覚えておくと便利ですよ。
