【Go入門】Goの基本型 – 文字列型(String types)

Go
スポンサーリンク

ここまで、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のところにあります。

fmt package - fmt - pkg.go.dev
Package fmt implements formatted I/O with functions analogous to C's printf and scanf.

実行結果はこう出力されます。

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の一覧があります。

strings package - strings - pkg.go.dev
Package strings implements simple functions to manipulate UTF-8 encoded 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をインポートして、文字列の操作を行います。ここでは扱わなかったメソッドがたくさんあるので、ドキュメントで確認しましょう。

Go
スポンサーリンク
CodeGraffitiをフォローする

コードグラフィティ ~ とにかく進もうプログラミング入門~
タイトルとURLをコピーしました