【文法系】【go】基本⑥:文字列型

本noteの概要

golang(以下、go)の基本的な文法と出力内容について確認する。

本noteの対象者

・goをインストール済みの方
※ 筆者は仮想環境上でgoを実行していますが、ローカル環境でも基本的に挙動は変わらないと思います、goがインストールされていれば問題ないかと。

▽ 仮想環境上でgoを動かしたい方は以下参考までに ▽
【手順系】【go】仮想環境上でのWebアプリケーション開発①:go環境構築 - This is My note

本noteの環境

PC環境(ホスト)

# OSのバージョン
(base) $ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G2022

# Virtualboxのバージョン
(base) $ VBoxManage -v
6.1.2r135662

# vagrantのバージョン
(base) $ vagrant -v
Vagrant 2.2.7

仮想環境(ゲスト)

# Linuxのバージョンが記載されているファイルを検索
vagrant@:~$ ls /etc/*-release
/etc/lsb-release  /etc/os-release

# ゲストOSのバージョンを出力
vagrant@:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"

仮想環境上のディレクトリ構成

workspace
  - src
    - test
      - lesson.go

現在のディレクト

vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$ pwd
/home/vagrant/workspace/src/test

【注】
 以降、特段の記述がない限り、コマンドの実行は現在のディレクトリ(test)で行われるものとし、文字数削減のため、表記を以下に省略して記述する。

 省略前:vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$
  ↓
 省略後:$

Today's Thema:goにおける文字列の取り扱い

1.文字の連結

package main

import (
    "fmt"
)
func main(){
    fmt.Println("Hello World!")
    fmt.Println("Hello " + "World!")
    fmt.Println("Hello", "World!")
}
▼ 実行
$ go run lesson.go

Hello World!
Hello World!
Hello World! 

2.指定したインデックス番号に対応する文字の出力

package main

import (
    "fmt"
)
func main(){
    fmt.Println(string("Hello!"[0]))
    fmt.Println(string("Hello!"[1]))
    fmt.Println(string("Hello!"[2]))
    fmt.Println(string("Hello!"[3]))
    fmt.Println(string("Hello!"[4]))
    fmt.Println(string("Hello!"[5]))
}
▼ 実行
$ go run lesson.go

H
e
l
l
o
!

《解説》
RubyPythonでは[]でインデックス番号を指定するだけで、対応する文字を出力することができるが、goではインデックス番号の指定に加えて、文字列型(string)であることを明示する必要がある。
なお、文字列型(string)を指定しなかった場合には、以下のようにアスキーコード(ASCII code)が出力される。

func main(){
    fmt.Println("Hello!"[0])
}
▼ 出力
72

3.文字の置換

使用例①
package main

import (
    "fmt"
    "strings" // ライブラリ(strings)のインポート
)
func main(){
    fmt.Println(strings.Replace("Hello", "H", "X", 1)) // 置換設定:strings.Replace("文字列" or 変数名, "変換対象の文字", "変換後の文字", 変換する回数)
}
▼ 実行
$ go run lesson.go

Xello
使用例②
package main

import (
    "fmt"
    "strings"
)
func main(){
    var s string = "Hello World"
    fmt.Println(strings.Replace(s, "l", "X", 2))
}
▼ 実行
$ go run lesson.go

HeXXo World

《解説》
上記については、あくまで文字を置き換えて出力しただけなので、元々の変数(s)の中身は変わっていない。変数の中身自体を変更したい場合は、置換した内容を再度変数に代入する必要がある。

package main

import (
    "fmt"
    "strings"
)
func main(){
    var s string = "Hello World"
    fmt.Println(strings.Replace(s, "l", "X", 2))
    fmt.Println(s)
    s = strings.Replace(s, "l", "X", 2)
    fmt.Println(s)
}
▼ 実行
$ go run lesson.go

HeXXo World
Hello World
HeXXo World

4.特定の文字を含むかどうかの確認

package main

import (
    "fmt"
    "strings"
)
func main(){
    var s string = "Hello World"
    fmt.Println(strings.Contains(s, "World"))
}
▼ 実行
$ go run lesson.go

true

5.文字の繰り返し

package main

import (
    "fmt"
    "strings"
)
func main(){
    fmt.Println(strings.Repeat("*", 20))
    fmt.Println("Hello World")
    fmt.Println(strings.Repeat("*", 20))
}
▼ 実行
$ go run lesson.go

********************
Hello World
********************

《解説》
RubyPythonでは乗算の演算子(*)を使って「"文字列"*出力回数」と書くことができるが、goでは使えないので注意。goでは「strings.Repeat("文字列" or 変数名, 出力回数)」とする必要がある。

6.文字列の改行

使用例①:改行箇所に「\n」をつける
package main

import (
    "fmt"
)
func main(){
    fmt.Println("Hello\n" +
    "World")
}
▼ 実行
$ go run lesson.go

Hello
World
使用例②:`(バッククォート)で囲む

※``で囲んだ場合、コード内の位置のまま出力される

package main

import (
    "fmt"
)
func main(){
    fmt.Println(`Hello
    World
    Hello
                Tsubasa
    `)
}
▼ 実行
$ go run lesson.go

Hello
    World
    Hello
                Tsubasa
    

7.その他

特殊文字("(ダブルクォーテーション)など)の出力
package main

import (
    "fmt"
)
func main(){
    fmt.Println("\"") // \(バックスラッシュ)をつける
    fmt.Println(`"`) // `(バッククォート)で囲む
}
▼ 実行
$ go run lesson.go

"
"