ホームページ >バックエンド開発 >Golang >golang はクロスプラットフォームをサポートしていますか?

golang はクロスプラットフォームをサポートしていますか?

青灯夜游
青灯夜游オリジナル
2023-01-12 17:14:563952ブラウズ

golang はクロスプラットフォームをサポートしています。そのモジュール設計とモジュール性、つまりコードがコンパイルされ、可能な限り最小のバイナリ形式に変換されるため、golang は依存関係を必要としません。そのコードはあらゆるプラットフォームでコンパイルでき、あらゆるサーバーおよびアプリケーションで使用できます。さらに、Go 言語には独自のリンカーがあり、システムが提供するコンパイラーやリンカーに依存しないため、コンパイルされたバイナリ実行可能ファイルはほぼすべてのシステム環境で実行できます。

golang はクロスプラットフォームをサポートしていますか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

golang はクロスプラットフォームをサポートしています。

#golang の特徴の 1 つは、プラットフォームに依存しないこと (クロスプラットフォーム コンパイル) です。

Go 言語は、Java 言語と同様に、プラットフォームの独立性をサポートします。そのモジュール設計とモジュール性により、つまりコードはコンパイルされ、可能な限り最小のバイナリ形式に変換されるため、依存関係は必要ありません。そのコードは、あらゆるプラットフォーム、あらゆるサーバー、アプリケーション上でコンパイルされます。

仮想マシンを使用する必要はなく、Go 言語コードをバイナリ実行可能ファイルとして直接出力できます。さらに、Go 言語には独自のリンカーがあり、システムが提供するコンパイラーやリンカーに依存しません。したがって、コンパイルされたバイナリ実行可能ファイルは、ほぼすべてのシステム環境で実行できます。

Golang は、C/C と同様、プラットフォーム関連のバイナリ ファイルにコンパイルされるため、golang で開発する場合は、クロスプラットフォーム サポートの問題も考慮する必要があります。この記事では、golang がクロスプラットフォームの問題をどのように解決するかを簡単にまとめます。

GOOS と GOARCH

まず、ランタイム パッケージの golang によって定義される 2 つのランタイム変数を理解する必要があります。

  • runtime.GOOS

  • ##runtime.GOARCH

GOOSこれは golang プログラムが実行されているターゲット マシンのオペレーティング システムであり、GOARC は golang プログラムが実行されているターゲット マシンのアーキテクチャです。それらの値はプログラムのコンパイル時に決定されます。これら 2 つの実行時変数 (実際には定数、以下を参照) の定義は次のとおりです。

// GOOS is the running program's operating system target:
// one of darwin, freebsd, linux, and so on.
const GOOS string = sys.GOOS

// GOARCH is the running program's architecture target:
// one of 386, amd64, arm, s390x, and so on.
const GOARCH string = sys.GOARCH

これら 2 つは、次のプログラムを通じて実行時に動的に取得できます。 ,


package main
import (
"fmt"
"runtime"
)

func main() {
fmt.Printf("OS: %s, ARCH: %s\n", runtime.GOOS, runtime.GOARCH)
}

クロスコンパイル問題

golangプログラムのコンパイルは、非常に簡単です。コンパイル オプションを考慮せずに go build を使用するだけです。たとえば、次のコマンドは、現在のディレクトリに "helloworld" という名前のバイナリ ファイルを生成します:

go build helloworld.go

しかし、問題は、現在のコンパイルがマシンの OS は Linux で、ARCH は amd64 であるため、コンパイルされたバイナリは Mac OS では実行できません。 Mac OS 上で一度再コンパイルすると、Mac OS 用のバイナリ ファイルを生成できます。ただしこの場合、対象となるすべてのプラットフォームに対してコンパイル環境を用意する必要があり、明らかに効率的な方法ではありません。

実際、この問題の解決は非常に簡単で、上記の 2 つのランタイム変数を使用するだけです。たとえば、Linux コンパイル環境しかないが、Mac OS で実行できるバイナリ ファイルを生成したい場合、2 つの環境変数を設定するだけで済みます。ターゲット OS が darwin で、ARCH が amd64 の場合は、次のコマンドを使用してコンパイルします:

$ GOOS=darwin GOARCH=amd64 go build helloworld.go

パッケージを複数のプラットフォームにサポートさせるには?

golang を使用して他の人が使用できるパッケージを開発してみませんか。では、パッケージを複数のプラットフォームにサポートするにはどうすればよいですか?実際、golang の標準ライブラリは基礎的な詳細を保護しているため、通常、開発者は一般的なアプリケーションを開発するときにこの問題を考慮する必要はありません。

バイナリ バージョンをリリースしたい場合は、上記のクロスコンパイルを通じて複数のプラットフォームをサポートするバージョンをリリースするだけです。

開発する golang プログラムが比較的低レベルのシステム コールを使用しており (もちろん、これは通常は推奨されません)、プラットフォームごとにシステム コールが異なる場合は、複数のシステム コールをサポートすることを検討する必要があります。プラットフォームの問題。プログラム内で runtime.GOOS および runtime.GOARCH の値を動的に決定し、if-else if または switch case ステートメントを使用してそれを処理することもできますが、これはメンテナンスに役立たず、メンテナンスに役立たないため、望ましい方法ではありません。コードが見苦しくなります。

推奨されるアプローチは、異なるプラットフォームの実装を異なるファイルに配置し、各ファイルがどのプラットフォームに対応するかを golang コンパイラーに指示することです。方法は 2 つあり、1 つ目はファイル名で指定する方法で、ファイル名のパターンは次のとおりです:

*_[GOOS]_[GOARCH].go

上記のファイル名では GOOS と GOARCH はどちらもオプションです。たとえば、Mac OS、Linux、および Windows プラットフォームに異なる実装があると仮定すると、これら 3 つのファイルに次のように名前を付けることができます。

yourfile_darwin.go
yourfile_linux.go
yourfile_windows.go

ターゲット プラットフォームが Linux の場合、yourfile_linux.go のみがコンパイルされます。ファイル名に GOOS も GOARCH も含まれていない場合 (たとえば、yourfile.go)、デフォルトでは常にコンパイルされます。

另外一种办法是通过一个特殊的注释。例如,假设你想使yourfile.go只在linux平台时才会编译,那么在文件头加上"+build linux"即可:

// +build linux

......

这里一定要注意,"+build linux"必须在所有代码的前面,但这条注释之前可以有空行或其它注释。它之后必须有一个空行。

这种通过注释的方式和通过文件名标示的方式作用相同,但是文件名的方式只能支持一个平台,而注释的方式可以标示一个文件同时支持多个平台,例如下面的注释标示该文件同时支持freebsd, openbsd和netbsd这三个平台:

// +build freebsd openbsd netbsd

注意多个平台之间用空格隔开时表示"或"的关系,如果用逗号隔开则表示"与"的关系,例如下面的注释表示 (linux AND 386) OR darwin:

// +build linux,386 darwin

这里只是介绍了最基本的使用场景,实际使用中,应该充分发挥软件设计的各种思想灵活使用。例如虽然针对不同的平台有不同的实现,但给上层客户端应用程序提供API应该统一。

【相关推荐:Go视频教程编程教学

以上がgolang はクロスプラットフォームをサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。