ここまで、Goの基本型として数値型、論理値型とみてきました。
ここでは、文字列型(String types)について見て行きます。
文字列型
文字列型は文字列値のセットです。個々の文字にアクセスして操作することができます。
文字列はstring型で、ダブルクォートで囲んで次のように宣言します。
var x string = "golang"
var x = "golang"
x := "golang"
これら3つは、同じ意味を示しています。
文字列型を操作するコードをいくつか書いてみましょう。
package main
import "fmt"
func main() {
fmt.Println("Hello Golang")
fmt.Println("Hello " + "Golang")
// var s string = "Go Programming"
s := "Go Programming"
fmt.Println(s)
fmt.Printf("%T\n", s)
fmt.Println(s[0])
fmt.Println(string(s[0]))
bs := []byte(s)
fmt.Println(bs)
fmt.Printf("%T\n", bs)
for i := 0; i < len(s); i++ {
fmt.Printf("%#U\n", s[i])
}
for i, v := range s {
fmt.Printf("index %d : %#x\n", i, v)
}
}
Println()で出力していますが、最初の2つ目のように、ダブルクォートで囲んだものを「+」で連結することもできます。
s[0]で最初の文字列を取り出して操作しています。
[]byte()で、それぞれの文字列のアスキーコードの配列に格納することができます。
for文を使ってループ処理でそれぞれの文字列を取り出して処理していますが、詳しいことはまた別のところでやるとして、%#Uを使っているところはUnicodeフォーマットで、%dは整数、%#xは16進数で表示するフォーマット出力の処理です。これらの値を取り出す処理をしています。
このあたりのフォーマットの分類は、ドキュメントのfmtのところにあります。
実行結果はこう出力されます。
Hello Golang
Hello Golang
Go Programming
string
71
G
[71 111 32 80 114 111 103 114 97 109 109 105 110 103]
[]uint8
U+0047 'G'
U+006F 'o'
U+0020 ' '
U+0050 'P'
U+0072 'r'
U+006F 'o'
U+0067 'g'
U+0072 'r'
U+0061 'a'
U+006D 'm'
U+006D 'm'
U+0069 'i'
U+006E 'n'
U+0067 'g'
index 0 : 0x47
index 1 : 0x6f
index 2 : 0x20
index 3 : 0x50
index 4 : 0x72
index 5 : 0x6f
index 6 : 0x67
index 7 : 0x72
index 8 : 0x61
index 9 : 0x6d
index 10 : 0x6d
index 11 : 0x69
index 12 : 0x6e
index 13 : 0x67
あえて、説明を省略していた部分があります。
s[0]で出力したところは、最初の文字列の「G」ではなく「71」のアスキーコードで出力されているのがわかると思います。
これをキャストするために次の行のコードでstring(s[0])として「G」を出力しています。
%#U、%#xは、%U、%xでもそれぞれUnicode、16進数として表示されますが、#をつけることでGoの構文として表示することができます。取り除いて出力してみると違いがわかると思います。
文字列の出力で、文章の途中で改行したい場合は次のような方法があります。
package main
import "fmt"
func main() {
fmt.Println("プログラミング言語では、\nGoよりもPythonが好きです。")
fmt.Println(`プログラミング言語では、
GoよりもPythonが好きです。`)
}
ひとつめは、\nの改行コードを文章の途中に入れる場合です。もうひとつはバッククォート(“)を使います。これで囲まれた文章は、実際にコードを改行して書くことができます。
プログラミング言語では、
GoよりもPythonが好きです。
プログラミング言語では、
åGoよりもPythonが好きです。
どちらも同じように表示できました。ちなみに、ほんとにPythonの方が好きです(笑)
strings パッケージ
文字列のいろいろな操作をするには、stringsパッケージをimportする必要があります。
と言っても、メソッドを利用する時に、VScodeではファイルの保存で追記されると思いますが。
imprt文に続けて、”strings”と記述して利用します。
パッケージのドキュメントにstringsの一覧があります。
全て触れるわけには行きませんが、いくつか次のコードで使ってみましょう。
package main
import (
"fmt"
"strings"
)
func main() {
s := "go programming"
fmt.Println(s)
fmt.Println(strings.Contains(s, "gra"))
fmt.Println(strings.ToUpper(s))
fmt.Println(strings.ToLower(s))
fmt.Println(strings.Title(s))
fmt.Println(strings.Count(s, "r"))
s = strings.Replace(s, "g", "n", 1)
fmt.Println(s)
}
順に見て行きましょう。
import文に”strings”が追加されています。
省略宣言で、文字列を宣言しています。全て小文字にしました。
Println()の中でstringsパッケージを使っています。
最初はContainsを使って、第1引数に文字列の変数を、第2引数に調べる文字列を代入しています。この文字列が含まれてるかどうかをtrue/falseで判定します。
次のToUpperで文字列を全て大文字にしています。
逆にToLowerで文字列を全て小文字にしています。
Titleで、文字列をタイトルケースにしています。
Conuntで、第2引数に入れた文字列が含まれる数をカウントしています。
Replaceで、第1引数の文字列の中の、第2引数に入れた文字の部分を、第3引数の文字で、第4引数に入れた数だけ先頭から置き換えるという処理をしています。
実行結果は次のようになります。
go programming
true
GO PROGRAMMING
go programming
Go Programming
2
no programming
それぞれ対応した処理の結果になっているのを確認しましょう。
他にもたくさんあるので、ドキュメントの中からいろいろ試してみるといいと思います。ドキュメントには例文コードをそのまま実行して結果を見ることができるので便利です。
Pythonコードで書くと…
では、Pythonで文字列型のコードを書いてみようと思いますが、Goとはエンコードの処理に結構仕様の違いのあるところで、説明が複雑になるのでここではその点は省略します。
def main():
print("Hello Python")
print("Hello " + "Python")
s = "Python Programming"
print(s)
print(type(s))
print(s[0])
for i in s:
print(i)
if __name__ == "__main__":
main()
s[0]で文字列のインデックスを指定して取り出すと、Goの場合と違って文字列が出力されます。
次のように出力されます。
Hello Python
Hello Python
Python Programming
<class 'str'>
P
P
y
t
h
o
n
P
r
o
g
r
a
m
m
i
n
g
続いて、Goと同様の文字列の操作をしてみましょう。
同じ処理のできるコードを書いてみます。
def main():
s = "python programming"
print("gra" in s)
print(s.upper())
print(s.lower())
print(s.title())
print(s.count("r"))
s = s.replace(" ", "-")
print(s)
if __name__ == "__main__":
main()
GoのContains以外は同じようなメソッドでの処理となります。
実行結果はこうなります。
True
PYTHON PROGRAMMING
python programming
Python Programming
2
python-programming
Pythonでの表示の改行(複数行)をやってみましょう。
Pythonでは以下の方法で表示することができます。
def main():
print("プログラミング言語では、")
print("本当にGoよりもPythonが好きです。")
print("プログラミング言語では、\n本当にGoよりもPythonが好きです。")
print("""プログラミング言語では、
本当にGoよりもPythonが好きです。""")
if __name__ == "__main__":
main()
まず、print()を複数使って表示させる方法です。これはちょっと不格好ですかね?
次は、Goと同様に\nの改行コードを使って表示する方法です。
最後は、トリプルクォート(”””)で、文章を囲んで、改行する方法です。
実行結果はこうなります。
プログラミング言語では、
本当にGoよりもPythonが好きです。
プログラミング言語では、
本当にGoよりもPythonが好きです。
プログラミング言語では、
本当にGoよりもPythonが好きです。
どれも同じように改行されて表示されているのがわかります。
最後に
ここでは、Go言語の文字列型を扱いました。
文字列はダブルクォート(””)で囲んで記述します。
fmtのドキュメントで文字のフォーマットの分類を確認しましょう。
パッケージのstringsをインポートして、文字列の操作を行います。ここでは扱わなかったメソッドがたくさんあるので、ドキュメントで確認しましょう。