Go 1.13 Toolset の使用

Red Hat Developer Tools 1

Go 1.13 Toolset のインストールおよび使用

概要

Go は、Red Hat Enterprise Linux プラットフォームで開発者向けの Red Hat 製品です。Go の使用では、この製品の概要、ツールの Go バージョンの呼び出しおよび使用方法、および詳細な情報を含むリソースへのリンクを説明します。

第1章 Go

1.1. Go ツールセットについて

Go ツールセットは、Red Hat Enterprise Linux プラットフォームで開発者向けの Red Hat 製品です。Go ツールセット 1.13 は、Go プログラミング言語ツールおよびライブラリーを提供します。Go は、golang としても知られています。

Go ツールセットは、Red Hat Enterprise Linux 7 の一部として配布されており、Red Hat Enterprise Linux 8 でモジュールとして利用できます。

以下のコンポーネントは、Go ツールセットの一部として利用できます。

表1.1 Go 1.13 コンポーネント

Nameバージョン説明

golang

1.13

Go コンパイラー。

1.2. 互換性

Go ツールセットは、Red Hat Enterprise Linux 7 および Red Hat Enterprise Linux 8 では、以下のアーキテクチャーで利用できます。

  • 64 ビット Intel および AMD アーキテクチャー
  • 64 ビット ARM アーキテクチャー
  • IBM Power Systems アーキテクチャー
  • IBM Power Systems アーキテクチャーのリトルエンディアンバリアント
  • IBM Z Systems アーキテクチャー

1.3. Red Hat Enterprise Linux 7 で Go ツールセットへのアクセス

本章では、Red Hat Enterprise Linux 7 システムに Go ツールセットをインストールする前に実行する手順を説明します。以下の手順をすべて実行して、Red Hat Developer Toolset レポジトリーにアクセスできるサブスクリプションをアタッチし、Red Hat Developer Tools および Red Hat Software Collections レポジトリーを有効化します。

前提条件

  • wget がシステムにインストールされていることを確認します。このツールは、デフォルトの Red Hat Enterprise Linux リポジトリーから利用できます。これをインストールするには、root で以下のコマンドを入力します。

    # yum install wget

手順

  1. サーバーから最新のサブスクリプションデータを取得します。

    # subscription-manager refresh
  2. 以下のコマンドを使用して、システムを登録します。

    # subscription-manager register

    また、Red Hat Subscription Management ドキュメントの Registering and Unregistering a System の適切な手順に従って、システムを登録することもできます。

  3. システムで利用可能なすべてのサブスクリプションの一覧を表示し、サブスクリプションのプール ID を特定します。

    # subscription-manager list --available

    このコマンドは、サブスクリプション名、一意の ID、有効期限などの関連情報を表示します。プール ID は、Pool ID で始まる行に一覧表示されます。

  4. Red Hat Developer Tools リポジトリーへのアクセスを提供するサブスクリプションを割り当てます。直前の手順で特定したプール ID を使用します。

    # subscription-manager attach --pool=<appropriate pool ID from the subscription>
  5. システムに割り当てられているサブスクリプションの一覧を確認します。

    # sudo subscription-manager list --consumed
  6. rhel-7-variant-devtools-rpms レポジトリーを有効化します。

    # subscription-manager repos --enable rhel-7-variant-devtools-rpms

    バリアント を、Red Hat Enterprise Linux システムのバリアント (server または workstation) に置き換えます。

    Red Hat Enterprise Linux Server を使用して、最も幅広い開発ツールにアクセスすることを検討してください。

  7. rhel-variant-rhscl-7-rpms レポジトリーを有効化します。

    # subscription-manager repos --enable rhel-variant-rhscl-7-rpms

    バリアント を、Red Hat Enterprise Linux システムのバリアント (server または workstation) に置き換えます。

  8. Red Hat Developer Tools キーをシステムに追加します。

    # cd /etc/pki/rpm-gpg
    # wget -O RPM-GPG-KEY-redhat-devel https://www.redhat.com/security/data/a5787476.txt
    # rpm --import RPM-GPG-KEY-redhat-devel

サブスクリプションがシステムに割り当てられ、リポジトリーが有効になったら、「Go ツールセットのインストール」 の説明に従って Go ツールセットをインストールします。

関連資料

  • Red Hat Subscription Management を使用してシステムを登録し、サブスクリプションに関連付ける方法は、Red Hat Subscription Management のガイドを参照してください。

1.4. Go ツールセットのインストール

Go ツールセットは、Red Hat Enterprise Linux に含まれる標準のパッケージ管理ツールを使用してインストール、更新、アンインストール、および検査できる RPM パッケージのコレクションとして配布されています。Go ツールセットを Red Hat Enterprise Linux 7 システムにインストールするには、Red Hat Developer Tool コンテンツセットへのアクセスを提供する有効なサブスクリプションが必要です。Red Hat Enterprise Linux 7 システムを適切なサブスクリプションに関連付け、Go ツールセットにアクセスする方法は、「Red Hat Enterprise Linux 7 で Go ツールセットへのアクセス」 を参照してください。

重要

Go ツールセットをインストールする前に、利用可能なすべての Red Hat Enterprise Linux 更新をインストールします。

  1. オペレーティングシステムの Go ツールセットに含まれるすべてのコンポーネントをインストールします。

    • Red Hat Enterprise Linux 7 で、go-toolset-1.13 パッケージをインストールします。

      # yum install go-toolset-1.13
    • Red Hat Enterprise Linux 8 に、go-toolset モジュールをインストールします。

      # yum module install go-toolset

      これにより、すべての開発およびデバッグツール、および依存するパッケージがシステムにインストールされます。

  2. Go 言語ワークスペースディレクトリーを選択し、その場所を環境変数として $HOME/.bashrc ファイルに保存します。

    $ mkdir -p workspace_dir
    $ echo 'export GOPATH=workspace_dir' >> $HOME/.bashrc
    $ source $HOME/.bashrc

    workspace_dir ディレクトリーに適切な値を選択します。一般的な選択肢は $HOME/go です。

    mkdir コマンドで -p フラグを指定して、workspace_dir ディレクトリーとそれにつながるディレクトリーを作成します。

    GOPATH 変数が設定されていない場合、go コンパイラーは ~/go ディレクトリーを使用します。

関連情報

  • Workspace: Go 言語ワークスペース組織の説明Go プログラミング言語の公式ドキュメント。

インストール可能なドキュメント

Go ツールセットインストール可能なドキュメントをインストールするには、以下の手順を実行します。

  • Red Hat Enterprise Linux 7 で、go-toolset-1.13-golang-docs パッケージをインストールします。

    # yum install go-toolset-1.13-golang-docs

インストール可能なドキュメントは、 /opt/rh/go-toolset-1.13/root/usr/lib/go-toolset-1.13-golang/doc/docs.html にインストールされます。

  • Red Hat Enterprise Linux 8 で、golang-docs パッケージをインストールします。

    # yum install golang golang-docs

インストール可能なドキュメントは/usr/lib/golang/doc/docs.html にインストールされます。

1.5. 関連情報

Go ツールセットおよびその機能の詳細は、本書の対象外となります。詳細は、以下に記載のドキュメントを参照してください。

オンラインドキュメント

第2章 Go

go は、Go プログラミング言語のビルドツールおよび依存関係マネージャーです。

Go ツールセットには go 1.13 が同梱されています。

2.1. Go 1.13 プログラムの作成

Go プログラムを作成する場合、開発者は Go ワークスペースレイアウトのルールに従う必要があります。.go ソースファイルは、$GOPATH/src のサブディレクトリーに配置する必要があります。

例2.1 Go プログラムの作成

hello.go という名前の単一のソースファイルで設定される hello という名前のプログラムについて考えてみましょう。

$ mkdir -p $GOPATH/src/hello
$ cd $GOPATH/src/hello
$ touch hello.go

任意のテキストエディターで hello.go ファイルを編集して、以下のテキストを追加します。

package main

import (
    "fmt"
    "net/http"
)

func Welcome(w http.ResponseWriter, req *http.Request) {

    fmt.Fprintf(w, "<h1>Welcome to Go Toolset.</h1>")

}

func main() {

    fmt.Println("Hello.")
    fmt.Println("Starting http server.")
    // Register handler function
    http.HandleFunc("/welcome", Welcome)
    fmt.Println("Go to localhost:8080/welcome")
    fmt.Println("To terminate press CTRL+C.")
    // Start server
    http.ListenAndServe(":8080", nil)

}

関連情報

  • Workspace: Go 言語ワークスペース組織の説明Go プログラミング言語の公式ドキュメント。

2.2. go コンパイラーの使用

コマンドラインを使用して Go プログラムを構築するには、プロジェクトディレクトリーに移動し、以下のように go コンパイラーを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'go build -o output_file go_main_package'
  • Red Hat Enterprise Linux 8 の場合:

    $ go build -o output_file go_main_package

これにより、現在の作業ディレクトリーに output_file という名前のバイナリーファイルが作成されます。-o オプションを省略すると、コンパイラーは go_main_packagego_main_package の名前でファイルを作成します。

go_main_package がメインパッケージではない場合や、複数のプロジェクトや *.go ファイルが指定されている場合は、生成されるバイナリーは破棄されます。この場合、go build コマンドを使用して、提供されたプロジェクトまたはファイルをビルドできることを確認します。

注記

Red Hat Enterprise Linux 7 で scl ユーティリティーを使用してコマンドを実行すると、利用可能な Go バイナリーで実行することができます。すべてのコマンドで scl enable を使用せずに Red Hat Enterprise Linux 7 で Go ツールセットを使用するには、次のコマンドを指定してシェルセッションを実行します。

$ scl enable go-toolset-1.13 'bash'

例2.2 コマンドラインを使用した Go プログラムのコンパイル

例2.1「Go プログラムの作成」 にあるように、プログラム hello の作成が正常に終了した後で、プログラムをコンパイルします。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'go build hello.go'
  • Red Hat Enterprise Linux 8 の場合:

    $ go build hello.go

これにより、現在の作業ディレクトリーに hello という新しいバイナリーファイルが作成されます。

2.3. Go プログラムの実行

プログラムを go コンパイルすると、実行可能なバイナリーファイルが作成されます。コマンドラインでこのプログラムを実行するには、実行ファイルがあるディレクトリーに移動し、プログラムを実行します。

$ ./file_name

例2.3 コマンドラインで Go プログラムの実行

例2.2「コマンドラインを使用した Go プログラムのコンパイル」 にあるように hello バイナリーファイルを正常にコンパイルした後で、シェルプロンプトで以下のコマンドを実行します。

$ ./hello
Hello.
Starting http server.
Go to localhost:8080/welcome
To terminate press CTRL+C.

2.4. コンパイル済み Go プロジェクトのインストール

Go プロジェクトをインストールすると、実行ファイルとライブラリーがコンパイルされ、Go Workspace の適切なディレクトリーにコピーされます。その後、go ツールは、追加のプロジェクトで実行ファイルおよびライブラリーを使用できます。インストールされたプロジェクトの依存関係もインストールされます。したがって、作業中のプロジェクトに追加され、別の構造を形成せず、すべての Go プロジェクトをまとまりのあるシステムにします。

Go プロジェクトをインストールするには、go ツールを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'go install go_project'
  • Red Hat Enterprise Linux 8 の場合:

    $ go install go_project

install コマンドは、build コマンド と同じオプションを受け入れます。

2.5. Go プロジェクトのダウンロード

サードパーティーの Go プロジェクトをオンラインソースからダウンロードし、インストールするには、go ツールを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'go get 3rd_party_go_project'
  • Red Hat Enterprise Linux 8 の場合:

    $ go get 3rd_party_go_project

3rd_party_go_project オプションで使用できる値の詳細は、以下のコマンドを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'go help importpath'
  • Red Hat Enterprise Linux 8 の場合:

    $ go help importpath

2.6. 関連情報

go およびその機能の詳しい説明は、本書の対象外となっています。詳細は、以下に記載のドキュメントを参照してください。

インストールされているドキュメント

  • Go コンパイラーの help コマンドでは、使用方法の情報を表示します。ヘルプインデックスを表示するには、次のコマンドを実行します。

    • Red Hat Enterprise Linux 7 の場合:

      $ scl enable go-toolset-1.13 'go help'
    • Red Hat Enterprise Linux 8 の場合:

      $ go help
  • Go コンパイラー doc コマンドは、Go パッケージ のドキュメントを表示します。package_name のドキュメントを表示するには、次のコマンドを実行します。

    • Red Hat Enterprise Linux 7 の場合:

      $ scl enable go-toolset-1.13 'go doc package_name'

      doc コマンドの詳細は、次のコマンドを実行します。

      $ scl enable go-toolset-1.13 'go help doc'
    • Red Hat Enterprise Linux 8 の場合:

      $ go doc package_name

      doc コマンドの詳細は、次のコマンドを実行します。

      $ go help doc

オンラインドキュメント

  • Command go: go コンパイラーの公式ドキュメント。

以下も併せて参照してください。

  • 1章Go: Go の概要およびそのシステムへのインストール方法の詳細

第3章 gofmt

gofmt は、go コンパイラーとともにパッケージ化された Go プログラミング言語用のコードフォーマットツールです。

Go ツールセットには、gofmt 1.13 が同梱されています。

3.1. コードのフォーマット

code_path パスのすべてのコードをフォーマットするには、以下のように gofmt ツールを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'gofmt -w code_path'
  • Red Hat Enterprise Linux 8 の場合:

    $ gofmt -w code_path

このコマンドは、code_path パスを直接変更します。code_path が 1 つのファイルである場合、変更はファイルにのみ適用されます。code_path がディレクトリーである場合は、ディレクトリー内のすべての .go ファイルが処理されます。

code_path を省略すると、gofmt は代わりに標準入力を読み込みます。

元のファイルに書き込みせずにフォーマットされたコードを標準出力に出力するには、-w オプションを省略します。

3.2. コードの変更のプレビュー

指定したパス code_path でコードをフォーマットしてプレビューするには、以下のように -d オプションを指定して gofmt を実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'gofmt -d code_path'
  • Red Hat Enterprise Linux 8 の場合:

    $ gofmt -d code_path

統一された diff 形式の出力は、標準出力に出力されます。

-d および -w オプションの両方を組み合わせることができます。

3.3. コードの簡素化

指定されたパス code_path でコードを簡素化するには、以下のように -s オプションを指定して gofmt オプションを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'gofmt -s code_path'
  • Red Hat Enterprise Linux 8 の場合:

    $ gofmt -s code_path

code_path の下にあるコードは簡素化されます。-d オプションを使用して違いを表示し、-w オプションを使用してコードに変更を適用します。

3.4. コードのリファクタリング

gofmt ツールは、任意の置換を適用してコードをリファクタリングするために使用できます。ルール rewrite_rule に従って、指定のパス code_path のコードをリファクタリングするには、以下のように -r オプションを指定して gofmt ツールを実行します。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'gofmt -r rewrite_rule code_path'
  • Red Hat Enterprise Linux 8 の場合:

    $ gofmt -r rewrite_rule code_path

code_path のコードは、ルール rewrite_rule に従ってリファクタリングされます。-d オプションを使用して違いを表示し、-w オプションを使用してコードに変更を適用します。追加オプションは、ルール rewrite_rule の後に配置する必要があります。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'gofmt -r rewrite_rule -d code_path'
  • Red Hat Enterprise Linux 8 の場合:

    $ gofmt -r rewrite_rule -d code_path

書き換えルールに関する詳しい説明は、本書の対象外です。詳細は、「関連情報」 に記載されているリソースを参照してください。

3.5. 関連情報

gofmt ツールおよびその機能の詳しい説明は、本書の対象外となっています。詳細は、以下に記載のドキュメントを参照してください。

オンラインドキュメント

以下も併せて参照してください。

  • 1章Go: Go ツールセットの概要およびそのシステムへのインストール方法の詳細

第4章 Go Race Detector

Go ツールセットには Go 競合検出機能が含まれており、これは Go 標準ライブラリーの機能です。

4.1. Race Detector ツールのインストール

Red Hat Enterprise Linux 7 では、競合検出は、go-toolset-1.13-golang-race パッケージで提供されます。

# yum install go-toolset-1.13-golang-race

Red Hat Enterprise Linux 8 では、golang-race パッケージによって提供されます。

# yum install golang-race

このコマンドは、ランタイム競合検出を含む Go 標準ライブラリーのバリアントをインストールします。

4.2. レイス検出ベクトルの使用

Go プロジェクトでランタイム競合検出を使用するには、プロジェクトを操作するときに使用する go ツールコマンドに -race オプションを追加します。

競合検出を使用する最小限のアプローチには、-race オプションを指定してプロジェクトをビルドします。

  • Red Hat Enterprise Linux 7 の場合:

    $ scl enable go-toolset-1.13 'go build -race -o output_file go_main_package'
  • Red Hat Enterprise Linux 8 の場合:

    $ go build -race -o output_file go_main_package

生成された実行可能なバイナリーファイルを実行し、競合検出が検出されると、標準出力に警告が出力されます。

重要

競合検出には、大きなランタイムリソースのオーバーヘッドがあります。

注記

Red Hat Enterprise Linux 7 で scl ユーティリティーを使用してコマンドを実行すると、利用可能な Go バイナリーで実行することができます。すべてのコマンドで scl enable を使用せずに Red Hat Enterprise Linux 7 で Go ツールセットを使用するには、次のコマンドを指定してシェルセッションを実行します。

$ scl enable go-toolset-1.13 'bash'

4.3. 関連情報

Go 競合検出機能の詳細と、その機能は本ガイドの対象外です。詳細は、以下に記載のドキュメントを参照してください。

オンラインドキュメント

以下も併せて参照してください。

  • 1章Go: Go の概要およびそのシステムへのインストール方法の詳細

第5章 Go ツールセットを使用したコンテナーイメージ

Go ツールセットは、RHEL 7 および RHEL 8 のコンテナーイメージとして利用できます。Red Hat Container Registry からダウンロードできます。

5.1. イメージの内容

RHEL 7 および RHEL 8 コンテナーイメージは、次のパッケージに対応するコンテンツを提供します。

コンポーネントバージョンパッケージ

Go

1.13

go-toolset-1.13

5.2. イメージへのアクセス

必要なイメージをプルするには、root で以下のコマンドを実行します。

  • RHEL 7 コンテナーイメージの場合:
# podman pull registry.redhat.io/devtools/go-toolset-rhel7
# podman pull registry.redhat.io/ubi7/go-toolset
注記

2 つの RHEL 7 コンテナーイメージは同じコンテンツを提供します。

  • RHEL 8 コンテナーイメージの場合:
# podman pull registry.redhat.io/rhel8/go-toolset
# podman pull registry.redhat.io/ubi8/go-toolset
注記

2 つの RHEL 8 コンテナーイメージは同じコンテンツを提供します。

5.3. Source-to-Image を使用したビルダーイメージとしての使用

Go ツールセットコンテナーイメージは、Source-to-Image(S2I) ビルダーイメージとして使用するために準備されます。

これを行うには、以下のビルド環境変数を設定します。

IMPORT_URL
この変数を、コードの場所を指定する URL に設定します。go get command オプションのルールが適用されます。
INSTALL_URL

この変数を、ビルド時にアプリケーションのメイン実行可能ファイルを提供するパッケージの場所を指定する URL に設定します。go install コマンド のルールが適用されます。

この変数は、メインパッケージの場所が IMPORT_URL 数変で指定された場所と同一である場合に省略できます。

例5.1 Source-to-Image を使用した Go アプリケーションイメージの構築

md2man パッケージを GitHub リポジトリーからビルドするには、以下を実行します。

$ s2i build -e IMPORT_URL='github.com/cpuguy83/go-md2man' -e INSTALL_URL='github.com/cpuguy83/go-md2man' git://github.com/cpuguy83/go-md2man  registry.access.redhat.com/devtools/go-toolset-rhel7 md2man-app

ローカルで利用可能なアプリケーションイメージ md2man-app は、go-toolset コンテナーイメージを使用して GitHub のリポジトリーからビルドされます。

Go を S2I ビルダーイメージとしてフルに活用するには、変更した S2I assemble スクリプトを使用し、ビルドしている特定のアプリケーションをさらに調整してカスタムイメージをビルドします。

Source-to-Image を使用した Go の使用方法の詳細な説明は、本書の対象外です。Source-to-Image の詳細は以下を参照してください。

5.4. 関連情報

第6章 Go 1.13 Toolset の変更点

Go Toolset のバージョンが 1.12 から 1.13 に更新されました。以下は、主な変更点です。

  • RHEL システムが FIPS モードで起動すると、Go が FIPS 認定の暗号化モジュールを使用できるようになりました。GOLANG_FIPS=1 環境変数を使用してこのモードを手動で有効にできます。
  • Delve デバッガーのバージョン 1.3.2 が Go で利用可能になりました。これは、Go (golang) プログラミング言語のソースレベルのデバッガーです。現在、Delve は、Red Hat Enterprise Linux 7 と Red Hat Enterprise Linux 8 の両方の 64 ビット Intel および AMD アーキテクチャーでのみサポートされています。

    Delve デバッガーをインストールする方法:

    Red Hat Enterprise Linux 7 では、特別な操作は必要ありません。Delve は、Go ツールセットと共に自動的にインストールされます。

    Red Hat Enterprise Linux 8 の場合は、Root で以下のコマンドを実行します。

    # yum install delve

    Delve を使用して helloworld.go プログラムをデバッグする方法:

    Red Hat Enterprise Linux 7 の場合は、以下のコマンドを実行します。

    $ scl enable go-toolset-1.13 'dlv debug helloworld.go'

    Red Hat Enterprise Linux 8 の場合は、以下のコマンドを実行します。

    $ dlv debug helloworld.go

    Delve の詳細は、Delve のドキュメント を参照してください。