Go練習問題1-4:文字列操作を理解しよう

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

Go言語の初心者向け問題1-4:文字列操作を理解しよう

この問題を解くために必要な知識:
コメントの書き方、変数と定数基本データ型型のエイリアス文字列操作ポインタの基本nilの概念ビルトイン関数算術演算子とビット演算子、標準入力と出力、import文の使用

<<前の問題 問題集Top 次の問題>>




Go言語の文法「文字列操作」とは

ここでは文字列操作の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Go言語の文字列操作はプログラミングを学ぶ上で非常に重要な基本スキルです。特に、テキストを操作する場合、英語や日本語など異なる言語に対応することが求められることがあります。

このガイドでは、Go言語の基本的な文字列操作と、日本語と英語の文字列を扱う際の注意点について説明します。

Go言語の文字列操作の基本

Go言語では、文字列はUTF-8でエンコードされています。これにより、英語やその他の多くの言語と同様に、日本語などのマルチバイト文字も正しく処理できます。

文字列の連結

文字列を連結するには、+演算子を使用します。

package main

import "fmt"

func main() {
    greeting := "Hello, " + "World!"
    fmt.Println(greeting)  // 出力: Hello, World!
}

文字列の長さを取得

文字列の長さは、len関数で取得できます。ただし、この長さはバイト数で返されるため、日本語などのマルチバイト文字を含む場合は注意が必要です。

package main

import "fmt"

func main() {
    str := "こんにちは"
    fmt.Println(len(str))  // 出力: 15 (5文字だが、UTF-8では各文字が3バイト)
}

文字列の部分抽出

Goでは、スライスを使って文字列の部分を抽出できます。ただし、スライスはバイト単位で動作するため、日本語のようなマルチバイト文字を扱う際は注意が必要です。

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    str := "こんにちは"
    fmt.Println(str[0:3])  // 出力: � (不正なスライス)
    
    // 正しい部分文字列の抽出方法
    runeStr := []rune(str)
    fmt.Println(string(runeStr[0:2]))  // 出力: こん
}

英語と日本語の文字列操作の違い

英語の文字列操作

英語の文字列はほとんどが1バイト文字で構成されているため、len関数やスライス操作がそのまま期待通りに動作します。

package main

import "fmt"

func main() {
    str := "Hello"
    fmt.Println(len(str))  // 出力: 5
    fmt.Println(str[1:4])  // 出力: ell
}

日本語の文字列操作

日本語はマルチバイト文字(通常は3バイト)で構成されています。

Go言語では、文字単位で操作する際に、rune型を使用することが推奨されます。runeはUnicodeのコードポイントを表します。

package main

import "fmt"

func main() {
    str := "こんにちは"
    runeStr := []rune(str)
    
    // 文字単位での長さ取得
    fmt.Println(len(runeStr))  // 出力: 5
    
    // 文字単位での部分抽出
    fmt.Println(string(runeStr[0:2]))  // 出力: こん
}

まとめ

Go言語の文字列操作はシンプルでありながら、英語や日本語のような異なる文字セットを扱う場合にいくつかの注意点があります。

特に日本語のようなマルチバイト文字を扱う際には、rune型を使った操作が重要です。これらの基本を理解することで、さまざまな文字列操作を安心して行えるようになります。

Go練習問題1-4:日本語を使った文字列の操作プログラムを作ろう

Go言語では、文字列を操作するための基本的な方法がいくつかあります。

この問題では、文字列を連結し、その長さを取得し、部分的に抽出するプログラムを作成しましょう。

日本語の文字列を正しく扱うために、rune 型を使用して文字単位で操作することがポイントです。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. 「こんにちは、世界!」という文字列を連結して生成すること。
  2. 文字列の長さを取得し、文字単位で出力すること。
  3. 「世界!」を含む部分文字列を抽出すること。
  4. rune 型を使って文字列の部分抽出を行い、日本語の文字列を正確に処理すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

こんにちは、世界!
文字列の長さ(文字単位): 9
部分文字列: 世界!

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.main 関数の定義
 1-1. greeting という文字列変数の連結と宣言
 1-2. fmt.Println で greeting を出力
 1-3. runeLength という rune 型配列の長さを計算して宣言
 1-4. fmt.Println で文字列の長さを出力
 1-5. runes という rune 型配列に変換した greeting の部分抽出
 1-6. substring という部分文字列の抽出と宣言
 1-7. fmt.Println で部分文字列を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import "fmt"

func main() {
	// 文字列の連結
	greeting := /*【穴埋め問題1】ここに "こんにちは、" と "世界!" を連結するコードを書いてください*/ 
	fmt.Println(greeting) // 出力: こんにちは、世界!

	// 文字列の長さを取得 (文字単位)
	runeLength := /*【穴埋め問題2】ここに文字列の長さを取得するコードを書いてください*/ 
	fmt.Println("文字列の長さ(文字単位):", runeLength) // 出力: 文字列の長さ(文字単位): 9

	// 文字列の部分抽出 (runeで正しい文字列抽出)
	runes := []rune(greeting)
	substring := /*【穴埋め問題3】ここに部分文字列を抽出するコードを書いてください*/ 
	fmt.Println("部分文字列:", substring) // 出力: 部分文字列: 世界!
}

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import "fmt"

func main() {
	// 文字列の連結
	greeting := "こんにちは、" + "世界!"
	fmt.Println(greeting) // 出力: こんにちは、世界!

	// 文字列の長さを取得 (文字単位)
	runeLength := len([]rune(greeting))
	fmt.Println("文字列の長さ(文字単位):", runeLength) // 出力: 文字列の長さ(文字単位): 9

	// 文字列の部分抽出 (runeで正しい文字列抽出)
	runes := []rune(greeting)
	substring := string(runes[6:9])
	fmt.Println("部分文字列:", substring) // 出力: 部分文字列: 世界!
}

正解コードの解説

このGoプログラムは、文字列操作の基本を学ぶためのものです。特に、文字列の連結、文字列の長さの取得、そして文字列の一部を抽出する方法について解説します。

1. 文字列の連結

greeting := "こんにちは、" + "世界!"

最初に、greeting という変数に "こんにちは、""世界!" という2つの文字列を連結して代入します。+ 演算子を使うことで、複数の文字列を結合し、1つの新しい文字列を作成します。

2. 文字列の長さを取得 (文字単位)

runeLength := len([]rune(greeting))

次に、文字列の長さを取得しますが、Go言語では len() 関数が返すのはバイト数です。日本語のように1文字が複数バイトで表される場合、バイト数と文字数が異なります。

このため、文字数を正確に取得するためには、[]rune 型に変換し、その長さを len() 関数で取得する必要があります。

3. 文字列の部分抽出

runes := []rune(greeting)
substring := string(runes[6:9])

最後に、文字列の一部を抽出します。ここでも []rune 型に変換した上で、特定の範囲の文字を取り出します。

runes[6:9] により、「世界!」という部分文字列が正確に抽出されます。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る