LoginSignup
18
9

More than 5 years have passed since last update.

Go言語は空文字に対してstrings.splitを掛けると1要素の配列を返す

Last updated at Posted at 2015-08-19

Go言語に入門してうろうろしてますが、ちょっと困った挙動があったので書いてみます。

症状

main.go
func main() {
  l := strings.Split("", ",")
  fmt.Printf("%#v\n", l)       // []string{""}
  fmt.Println(len(l))          // 1
}

見ての通り、空文字に対してsplitすると1要素の配列が返ってきており、そのため、この返り値をfor ~ rangeなどで回すとループの中の処理が実行されてしまいます。

ググってみたところ、区切り文字の数 + 1個の要素を返す仕様とのこと。
https://groups.google.com/d/msg/golang-nuts/S7U1iRmuydg/qKu3Wcl4oOcJ

fmt.Println(len(strings.Split(",,", ",")))    // 3
fmt.Println(len(strings.Split(",", ",")))     // 2
fmt.Println(len(strings.Split("", ",")))      // 1

つまりこういう理屈ですか。う、うーん……$x^0 = 1$みたいなもので、わからないではないけれど、rubyに慣れていると戸惑いますね。

対処法

splitした結果に対してfor ~ rangeの書き方をする場合などは空文字が来ることを考慮して、先にはじくか、ループの先頭で空文字判定してcontinueするかの処理が必要そうです。

他言語(追記)

ふと思いついたので他の言語も試してみました。

言語 件数
ruby 0
Go 1
JavaScript 1
Python 1
Perl 0
PHP 1
Java 1
awk 1 1
vim script2 0 or 1 (keepempty次第)

あっ、これ0の方が少数派だ。

18
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
9