IT関連
PR

【Golang】list型の配列をカンマなど特定の区切り文字で連結する

saratogax
記事内に商品プロモーションを含む場合があります

普段、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, 3

Go の標準パッケージだけで implode 相当の処理ができるので、覚えておくと便利ですよ。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました