Go言語入門:よくある質問 -デザイン Vol.2-

スポンサーリンク
Go言語入門:よくある質問 -デザイン Vol.2- ノウハウ
Go言語入門:よくある質問 -デザイン Vol.2-
この記事は約5分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

本日は、Go言語のよくある質問 について解説しています。

スポンサーリンク

背景

Go言語を学んでいると「なんでこんな仕様になっているんだろう?」「他の言語と違うのはなぜ?」といった疑問が湧いてきませんか。Go言語の公式サイトにあるFAQページには、そんな疑問に対する開発チームからの丁寧な回答がたくさん載っているんです。ただ、英語で書かれているため読むのに少しハードルがあるのも事実で、今回はこのFAQを日本語に翻訳して、Go言語への理解を深めていけたらと思い、これを読んだ時の内容を備忘として残しました。

デザイン

Unicode識別子はどうなっていますか?

Goを設計する際、私たちはそれが過度にASCII中心的にならないようにしたいと考えていました。これは、識別子の空間を7ビットASCIIの制限から拡張することを意味していました。Goのルール—識別子の文字はUnicodeによって定義された文字または数字でなければならない—は理解しやすく実装しやすいですが、制限があります。たとえば、結合文字は設計上除外されており、これはデーヴァナーガリーなどの一部の言語を除外します。

このルールには、もう一つの不幸な結果があります。エクスポートされた識別子は大文字で始まらなければならないため、一部の言語の文字から作成された識別子は、定義上、エクスポートできません。今のところ、唯一の解決策はX日本語のようなものを使用することですが、これは明らかに不満足です。

言語の最初期のバージョンから、他の母国語を使用するプログラマーに対応するために識別子空間を最適に拡張する方法について、かなりの検討が行われてきました。正確に何をするかは、依然として活発な議論のトピックであり、言語の将来のバージョンでは識別子の定義においてより自由になるかもしれません。たとえば、Unicode組織の識別子に関する勧告からのいくつかのアイデアを採用するかもしれません。何が起こったとしても、文字の大小が識別子の可視性を決定する方法を保持(または拡張)しながら、互換性を保って行わなければなりません。これは私たちのGoのお気に入りの機能の一つです。

当分の間、私たちには曖昧な識別子を許可するルールから確実に生じるであろうバグを避ける、後でプログラムを壊すことなく拡張できるシンプルなルールがあります。

解説

この節では、Go言語における非ASCII文字の識別子使用について、現在の制限と将来の展望を説明しています。国際化対応における複雑な問題を扱っています。

現在のGo言語の識別子ルール

基本ルール

  • Unicode文字: ASCII以外の文字も識別子に使用可能
  • 文字または数字: Unicode定義に従った分類
  • 結合文字の除外: デザイン上の制限

実際の使用例

// 使用可能な例
var 変数名 string = "日本語変数"
var αβγ int = 123
var москва string = "ロシア語"

func 関数名() {
    fmt.Println("日本語関数名")
}

// エクスポートできない問題
var 日本語 string = "unexported" // 小文字扱い

エクスポートルールの問題

大文字・小文字の制約 Go言語では、識別子の可視性が最初の文字の大小で決まります:

  • 大文字開始: パッケージ外からアクセス可能(exported)
  • 小文字開始: パッケージ内のみアクセス可能(unexported)

非ASCII文字での問題

// 問題のある例
var 日本語 string // 「日」は大文字・小文字の概念がない

// 現在の回避策
var X日本語 string // 明らかに不自然

言語固有の課題

デーヴァナーガリー文字(ヒンディー語など)

  • 結合文字: 複数の文字が組み合わさって一つの文字を形成
  • Go言語での除外: 結合文字は現在サポートされていない
  • 影響: インド系言語でのプログラミングに制限

その他の言語での課題

  • アラビア語: 右から左への文字記述
  • 中国語・日本語: 大文字・小文字の概念がない漢字
  • ハングル: 組み合わせ文字の複雑さ

Unicode組織の勧告

UAX #31(Unicode Identifier and Pattern Syntax) Unicode Consortiumが提供する識別子に関するガイドライン:

  • XID_Start: 識別子の開始に使用可能な文字
  • XID_Continue: 識別子の継続に使用可能な文字
  • 正規化: 文字の統一的な表現

将来の可能性

// 将来的に可能になるかもしれない例
export 日本語変数 string  // 明示的なエクスポート指定
público variableEspañol int  // スペイン語での明示的指定

設計上の考慮事項

互換性の維持

  • 後方互換性: 既存コードが動作し続ける必要
  • 段階的改善: 急激な変更は避ける
  • 明確なルール: 曖昧さを排除

可視性システムの保持 Go言語の可視性システムは重要な特徴:

  • シンプルさ: 追加のキーワード不要
  • 視覚的明確さ: コードを見ただけで可視性が分かる
  • コンパイル時チェック: 実行時エラーの防止

実用的な現在の対処法

パッケージ名での工夫

package nihongo  // ASCII文字でパッケージ名

// パッケージ内では日本語識別子を使用
var データ string = "internal use"

// エクスポートが必要な場合
var Data string = "exported"

ドキュメントでの補完

// Data は日本語でデータを意味します
var Data string

// Func は特定の処理を行う関数です(日本語: 関数)
func Func() {}

将来への期待 この問題は、プログラミング言語の国際化における普遍的な課題です。Go言語開発チームが慎重に検討を続けていることで、将来的により自然で使いやすいソリューションが提供される可能性があります。国際的なプログラミングコミュニティにとって重要な改善となるでしょう。

おわりに 

本日は、Go言語のよくある質問について解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました