go install コマンドの用途は何ですか?
「go install」コマンドは、指定されたコード パッケージとその依存パッケージをコンパイルおよびインストールするために使用されます。指定されたコード パッケージの依存パッケージがコンパイルおよびインストールされていない場合、このコマンドは最初に依存パッケージを処理します。パッケージです。 「go install」コマンドは、コンパイルされた中間ファイルを GOPATH の pkg ディレクトリに配置し、コンパイル結果を GOPATH の bin ディレクトリに永続的に配置します。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
go install コマンド - コンパイルとインストール
go install
コマンドは、指定されたコード パッケージをコンパイルしてインストールするために使用されます。およびその依存パッケージ。指定されたコード パッケージの依存パッケージがコンパイルおよびインストールされていない場合、このコマンドは最初に依存パッケージを処理します。 go build
コマンドと同様に、go install
コマンドに渡されるコード パッケージ パラメーターは、インポート パスの形式で指定する必要があります。さらに、go build
コマンドのタグのほとんどは、go install
コマンドでも使用できます。実際、go install
コマンドは、go build
コマンドよりも 1 つだけ多くのことを行います。それは、コンパイルされた結果ファイルを指定されたディレクトリにインストールすることです。
go install コマンドの詳細を説明する前に、まず goc2p のディレクトリ構造を確認してください。スペースを節約するために、ここではコード パッケージ内のソース コード ファイルを非表示にしました。次のように:
$HOME/golang/goc2p: bin/ pkg/ src/ cnet/ logging/ helper/ ds/ pkgtool/
goc2p プロジェクトには 3 つのサブディレクトリ、つまり bin ディレクトリ、pkg ディレクトリ、および src ディレクトリがあることがわかります。現在、src ディレクトリのみにいくつかのディレクトリが含まれており、他の 2 つのディレクトリは空です。
次に、コード パッケージをインストールするためのルールを見てみましょう。
コード パッケージをインストールします
go install
コマンドに続くコード パッケージにライブラリ ソース コード ファイルのみが含まれている場合は、 go install
コマンドは、ソース コード ファイルが配置されているワークスペースの pkg ディレクトリにコンパイルされた結果ファイルを保存します。ライブラリ ソース ファイルのみを含むコード パッケージの場合、この結果ファイルは、対応するコード パッケージ アーカイブ ファイル (静的リンク ライブラリ ファイルとも呼ばれ、名前は .a で終わります) です。対照的に、go build
コマンドを使用してライブラリ ソース ファイルのみを含むコード パッケージをコンパイルすると、現在のワークスペースの src ディレクトリと pkg ディレクトリに結果ファイルは生成されません。結果ファイルはコンパイル目的で一時ディレクトリに生成されますが、現在のワークスペース ディレクトリは変更されません。
コード パッケージ パラメーターを指定せずに go install
コマンドを実行すると、コマンドは現在のディレクトリに対応するコード パッケージをコンパイルしようとします。たとえば、コード パッケージ pkgtool
:
hc@ubt:~/golang/goc2p/src/pkgtool$ go install -v -work WORK=D:\cygwin\tmp\go-build758586887 pkgtool
をインストールしたいとします。 前に述べたように、go install
コマンドを実行すると、指定されたコード パッケージは次のようになります。コンパイルしてインストールします。このうち、コンパイルされたコード パッケージは、go build
コマンドと同じプログラムを使用します。したがって、go install
コマンドを実行すると、最初に go-build という接頭辞が付いた名前の一時ディレクトリが作成されます。指定したコード パッケージとその依存パッケージを強制的に再インストールする場合は、タグ -a
:
hc@ubt:~/golang/goc2p/src/pkgtool$ go install -a -v -work WORK=/tmp/go-build014992994 runtime errors sync/atomic unicode unicode/utf8 sort sync io syscall strings bytes bufio time os path/filepath pkgtool
を追加する必要があります。ご覧のとおり、コード パッケージ pkgtool
は Go 言語標準ライブラリのコード パッケージにのみ依存します。
ここで goc2p プロジェクト ディレクトリを見てみましょう:
$HOME/golang/goc2p: bin/ pkg/ linux_386/ pkgtool.a src/
これで、pkg ディレクトリに追加のサブディレクトリができました。セクション 0.0 を読んだ読者は、linux_386 がプラットフォーム関連ディレクトリと呼ばれることをすでに知っているはずです。その名前は ${GOOS}_${GOARCH} から取得できます。このうち、${GOOS} と ${GOARCH} は、それぞれ現在のオペレーティング システムの環境変数 GOOS と GOARCH の値です。これらが存在しない場合、Go 言語は内部で事前に決定された値を使用します。上記の例は、コンピューティング アーキテクチャ 386 とオペレーティング システム Linux を備えたコンピューター上で実行されます。したがって、ここでのプラットフォーム関連のディレクトリは linux_386 です。 goc2p プロジェクトのプラットフォーム関連ディレクトリに pkgtool.a という名前のファイルがあることもわかります。これは、コード パッケージ pkgtool のアーカイブ ファイルです。ファイル名は、コード パッケージ名と「.a」接尾辞を組み合わせたものです。
実際、コード パッケージのアーカイブ ファイルは、常に pkg ディレクトリのプラットフォーム関連ディレクトリに直接保存されるわけではなく、このプラットフォーム関連ディレクトリのサブディレクトリに保存される場合もあります。次に、cnet/ctcp パッケージをインストールします。
hc@ubt:~/golang/goc2p/src/pkgtool$ go install -a -v -work ../cnet/ctcp WORK=/tmp/go-build083178213 runtime errors sync/atomic unicode unicode/utf8 math sync sort io syscall internal/singleflight bytes strings strconv bufio math/rand time reflect os fmt log runtime/cgo logging net cnet/ctcp
コード パッケージ pkgtool に対応するディレクトリに cnet/ctcp パッケージをインストールすることに注意してください。ディレクトリの相対パスを使用しました。
実際、コード パッケージの場所を提供するこの方法はローカル コード パッケージ パス方法と呼ばれ、以前に紹介した go build コマンドを含むすべての Go コマンドで受け入れられる方法でもあります。 。ただし、ローカル コード パッケージ パスはディレクトリ相対パスの形式でのみ指定でき、ディレクトリ絶対パスは使用できないことに注意してください。次の例を参照してください。
hc@ubt:~/golang/goc2p/src/cnet/ctcp$ go install -v -work ~/golang/goc2p/src/cnet/ctcp can't load package: package /home/hc/golang/goc2p/src/cnet/ctcp: import "/home/hc/golang/goc2p/src/cnet/ctcp": cannot import absolute path
上記の例のコマンド プロンプト情報から、ディレクトリへの絶対パスの形式でコード パッケージの場所を指定しても、Go コマンドでは認識されないことがわかります。
这是由于Go认为本地代码包路径的表示只能以“./”或“../”开始,再或者直接为“.”或“..”,而代码包的代码导入路径又不允许以“/”开始。所以,这种用绝对路径表示代码包位置的方式也就不能被支持了。
上述规则适用于所有Go命令。读者可以自己尝试一下,比如在执行go build命令时分别以代码包导入路径、目录相对路径和目录绝对路径的形式提供代码包位置,并查看执行结果。
我们已经通过上面的示例强行的重新安装了cnet/ctcp包及其依赖包。现在我们再来看一下goc2p的项目目录:
$HOME/golang/goc2p: bin/ pkg/ linux_386/ /cnet ctcp.a logging.a pkgtool.a src/
我们发现在pkg目录的平台相关目录下多了一个名为cnet的目录,而在这个目录下的就是名为ctcp.a的代码包归档文件。由此我们可知,代码包归档文件的存放目录的相对路径(相对于当前工作区的pkg目录的平台相关目录)即为代码包导入路径除去最后一个元素后的路径。而代码包归档文件的名称即为代码包导入路径中的最后一个元素再加“.a”后缀。再举一个例子,如果代码包导入路径为x/y/z,则它的归档文件存放路径的相对路径即为x/y/,而这个归档文件的名称即为z.a。
回顾代码包pkgtool的归档文件的存放路径。因为它的导入路径中只有一个元素,所以其归档文件就被直接存放到了goc2p项目的pkg目录的平台相关目录下了。
此外,我们还发现pkg目录的平台相关目录下还有一个名为logging.a的文件。很显然,我们并没有显式的安装代码包logging。这是因为go install命令在安装指定的代码包之前,会先去安装指定代码包的依赖包。当依赖包被正确安装后,指定的代码包的安装才会开始。由于代码包cnet/ctcp依赖于goc2p项目(即当前工作区)中的代码包logging,所以当代码包logging被成功安装之后,代码包cnet/ctcp才会被安装。
还有一个问题:上述的安装过程涉及到了那么多代码包,那为什么goc2p项目的pkg目录中只包含该项目中代码包的归档文件呢?实际上,go install命令会把标准库中的代码包的归档文件存放到Go语言安装目录的pkg子目录中,而把指定代码包依赖的第三方项目的代码包的归档文件存放到当前工作区的pkg目录下。这样就实现了Go语言标准库代码包的归档文件与用户代码包的归档文件,以及处在不同工作区的用户代码包的归档文件之间的分离。
安装命令源码文件
除了安装代码包之外,go install命令还可以安装命令源码文件。为了看到安装命令源码文件是goc2p项目目录的变化,我们先把该目录还原到原始状态,即清除bin子目录和pkg子目录下的所有目录和文件。然后,我们来安装代码包helper/ds下的命令源码文件showds.go,如下:
hc@ubt:~/golang/goc2p/src$ go install helper/ds/showds.go go install: no install location for .go files listed on command line (GOBIN not set)
这次我们没能成功安装。该Go命令认为目录/home/hc/golang/goc2p/src/helper/ds不在环境GOPATH中。我们可以通过Linux的echo命令来查看一下环境变量GOPATH的值:
hc@ubt:~/golang/goc2p/src$ echo $GOPATH /home/hc/golang/lib:/home/hc/golang/goc2p
环境变量GOPATH的值中确实包含了goc2p项目的根目录。这到底是怎么回事呢?
我通过查看Go命令的源码文件找到了其根本原因。在上一小节我们提到过,在环境变量GOPATH中包含多个工作区目录路径时,我们需要在编译命令源码文件前先对环境变量GOBIN进行设置。实际上,这个环境变量所指的目录路径就是命令程序生成的结果文件的存放目录。go install命令会把相应的可执行文件放置到这个目录中。
由于命令go build在编译库源码文件后不会产生任何结果文件,所以自然也不用会在意结果文件的存放目录。在该命令编译单一的命令源码文件或者包含一个命令源码文件和多个库源码文件时,在结果文件存放目录无效的情况下会将结果文件(也就是可执行文件)存放到执行该命令时所在的目录下。因此,即使环境变量GOBIN的值无效,我们在执行go build命令时也不会见到这个错误提示信息。
然而,go install命令中一个很重要的步骤就是将结果文件(归档文件或者可执行文件)存放到相应的目录中。所以,go install命令在安装命令源码文件时,如果环境变量GOBIN的值无效,则它会在最后检查结果文件存放目录的时候发现这一问题,并打印与上述示例所示内容类似的错误提示信息,最后直接退出。
这个错误提示信息在我们安装多个库源码文件时也有可能遇到。示例如下:
hc@ubt:~/golang/goc2p/src/pkgtool$ go install envir.go fpath.go ipath.go pnode.go util.go go install: no install location for .go files listed on command line (GOBIN not set)
而且,在我们为环境变量GOBIN设置了正确的值之后,这个错误提示信息仍然会出现。这是因为,只有在安装命令源码文件的时候,命令程序才会将环境变量GOBIN的值作为结果文件的存放目录。而在安装库源码文件时,在命令程序内部的代表结果文件存放目录路径的那个变量不会被赋值。最后,命令程序会发现它依然是个无效的空值。所以,命令程序会同样返回一个关于“无安装位置”的错误。这就引出一个结论,我们只能使用安装代码包的方式来安装库源码文件,而不能在go install命令罗列并安装它们。另外,go install命令目前无法接受标记-o以自定义结果文件的存放位置。这也从侧面说明了go install命令不支持针对库源码文件的安装操作。
至此,我们对怎样用go install命令来安装代码包以及命令源码文件进行了说明。如果你已经熟知了go build命令,那么理解这些内容应该不在话下。
以上がgo install コマンドの用途は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

統合されたservicesと統合されたpothonistoninfrastructure、userestapisorgrpcforinter-servicecommunication、goandpythonappstoStoStosandizedprotocols.1.userestapis(Frameworkslikeginingoand flaskinpython)またはuserestapisを許可します

Golangofferssuperiorporformance、nativeconconcurrencyviagoroutines、および効率的なresourceusage、makingitidealforhigh-raffic、low-latencyapis;

gousesisificlylessmemorython whenrunningwebservicesdueTolanguagedesisinandconcurrencyModeldifferences.1.go'sgoroutinesareLightwithMalstackoverhead

pythonisthedominantlanguageformachineLearnelearningduetoitsmaterecosystem、whilefors lightweighttoolssutitedforspecificusecases.pythonexcelswithlibrariesliketensorflow、pytorch、scikit-learn、andpandas、makingitedealforrese edearted d

メモリ管理におけるGOとPythonのコアの違いは、さまざまなごみ収集メカニズムです。 GOは、プログラムロジックと同時に自動的に実行および実行する同時マーククリアランス(MarkandSweep)GCを使用し、循環参照を効果的に扱います。高い並行性シナリオに適していますが、リサイクル時間を正確に制御することはできません。 Pythonは主に参照カウントに依存しており、オブジェクト参照はゼロになったときにすぐにリリースされます。利点は、即時のリサイクルと簡単な実装であることですが、循環参照の問題があるため、GCモジュールを使用してクリーニングを支援する必要があります。実際の開発では、GOは高性能サーバープログラムにより適していますが、Pythonはスクリプトクラスまたはパフォーマンス要件が低いアプリケーションに適しています。

Pythonは、広範な適用性、豊富なコミュニティリソース、成熟したエンタープライズサポートを必要とするシナリオに適しています。巨大なコミュニティ、豊かな図書館、ビジネスサポートがあり、データサイエンス、自動化、従来のシステム統合に適しています。 2. Golangは、クラウドネイティブ、マイクロサービス、DevOpsなどの高性能バックエンドシナリオに適しています。コミュニティは小さいですが、急速に成長します。優れた並行性モデルとパフォーマンスを備えており、インフラストラクチャの近代化に適しています。 3.選択は、企業の特定のニーズに依存します。迅速に開始し、幅広い才能保護区を持つ必要がある場合は、Pythonを選択してください。高い並行性とスケーラブルなサービス構造に焦点を当てる場合、Golangの方が優れています。どちらのコミュニティにも独自の強みがあり、最終的には、絶対的な長所と短所ではなく、技術的な目標に基づいて決定を下す必要があります。

配布用のコマンドラインツールを構築する場合、GolangはPythonよりも適しています。理由には次のものが含まれます。1。単純な分布、および追加の依存関係なしに、GOコンパイルの後に単一の静的バイナリファイルが生成されます。 2。高速スタートアップ速度、低リソースの使用、GOは、コンパイルされた言語、高い実行効率、および小さなメモリの使用法です。 3。クロスプラットフォームのコンパイルをサポートし、追加のパッケージングツールは必要ありません。また、単純なコマンドで異なるプラットフォームの実行可能ファイルを生成できます。対照的に、Pythonでは、開始が遅く、複雑なパッケージングプロセスがあり、互換性と誤検知を起こしやすくなりやすいランタイムおよび依存関係ライブラリのインストールが必要なため、展開の経験とメンテナンスコストの点ではGOではそれほど良くありません。

インターフェイスはポインタータイプではなく、動的タイプと値の2つのポインターが含まれています。 1.インターフェイス変数は、特定のタイプのタイプ記述子とデータポインターを保存します。 2。ポインターをインターフェイスに割り当てるとき、ポインターのコピーを保存すると、インターフェイス自体がポインタータイプではありません。 3.インターフェイスがゼロであるかどうかは、同時にタイプと値を判断する必要があります。 4.メソッドレシーバーがポインターである場合、ポインタータイプのみがインターフェイスを実現できます。 5.実際の開発では、インターフェイスのバリューコピーとポインター転送の違いに注意してください。これらを理解することで、ランタイムエラーを回避し、コードセキュリティを改善できます。
