Heim >Backend-Entwicklung >Golang >Unterstützt Golang plattformübergreifend?
golang unterstützt plattformübergreifend. Aufgrund seines modularen Aufbaus und seiner Modularität, d. h. Code wird in die kleinstmögliche Binärform kompiliert und konvertiert, erfordert Golang keine Abhängigkeiten, sein Code kann auf jeder Plattform kompiliert werden und kann auf jedem Server und jeder Anwendung kompiliert werden. Darüber hinaus verfügt die Go-Sprache über einen eigenen Linker und ist nicht auf den von einem System bereitgestellten Compiler und Linker angewiesen. Daher kann die kompilierte ausführbare Binärdatei in fast jeder Systemumgebung ausgeführt werden.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
golang unterstützt plattformübergreifend.
Eines der Merkmale von Golang ist: Plattformunabhängigkeit (plattformübergreifende Kompilierung).
Go-Sprache ist wie Java-Sprache und unterstützt Plattformunabhängigkeit. Aufgrund seines modularen Aufbaus und der Modularität, d. h. der Code wird in die kleinstmögliche Binärform kompiliert und konvertiert, benötigt er daher keine Abhängigkeiten. Sein Code lässt sich auf jeder Plattform und auf jedem Server und jeder Anwendung kompilieren.
Es ist keine virtuelle Maschine erforderlich, der Go-Sprachcode kann direkt als binäre ausführbare Datei ausgegeben werden. Darüber hinaus verfügt die Go-Sprache über einen eigenen Linker und ist nicht auf den von irgendeinem System bereitgestellten Compiler und Linker angewiesen. Daher kann die kompilierte binäre ausführbare Datei in nahezu jeder Systemumgebung ausgeführt werden.
Golang wird wie C/C++ in plattformbezogene Binärdateien kompiliert. Wenn Sie also mit Golang entwickeln, müssen Sie auch die Frage der plattformübergreifenden Unterstützung berücksichtigen. Dieser Artikel fasst kurz zusammen, wie Golang plattformübergreifende Probleme löst.
GOOS und GOARCH
Zunächst müssen Sie die beiden von Golang im Laufzeitpaket definierten Laufzeitvariablen verstehen:
runtime.GOOS
runtime.GOOS
runtime.GOARCH
runtime.GOARCH
GOOS ist das Betriebssystem des Zielcomputers, auf dem das Golang-Programm ausgeführt wird, und GOARC ist die Architektur des Zielcomputers, auf dem das Golang-Programm ausgeführt wird. Ihre Werte werden beim Kompilieren des Programms ermittelt. Die Definitionen dieser beiden Laufzeitvariablen (eigentlich Konstanten, siehe unten) lauten wie folgt:
// 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
Sie können diese beiden Werte zur Laufzeit dynamisch über das folgende Programm erhalten:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("OS: %s, ARCH: %s\n", runtime.GOOS, runtime.GOARCH)
}
go build helloworld.goAber das Problem ist, dass die kompilierte Binärdatei nicht unter Mac OS ausgeführt werden kann, wenn das Betriebssystem der aktuellen Kompilierungsmaschine Linux und ARCH amd64 ist. Sie können unter Mac OS einmal neu kompilieren, um eine Binärdatei für Mac OS zu erstellen. In diesem Fall ist es jedoch erforderlich, eine Kompilierungsumgebung für alle Zielplattformen vorzubereiten, was offensichtlich keine effektive Methode ist.
Tatsächlich ist die Lösung dieses Problems sehr einfach. Verwenden Sie einfach die beiden oben genannten Laufzeitvariablen. Wenn Sie beispielsweise nur über eine Linux-Kompilierungsumgebung verfügen, aber eine Binärdatei generieren möchten, die unter Mac OS ausgeführt werden kann, müssen Sie nur zwei Umgebungsvariablen festlegen. Wenn das Zielbetriebssystem Darwin und ARCH amd64 ist, verwenden Sie zum Kompilieren den folgenden Befehl: $ GOOS=darwin GOARCH=amd64 go build helloworld.go
Machen Sie mit und entwickeln Sie ein Paket in Golang, das andere verwenden können , dann Wie sorgen Sie dafür, dass Ihr Paket mehrere Plattformen unterstützt? Tatsächlich müssen Entwickler dieses Problem bei der Entwicklung allgemeiner Anwendungen normalerweise nicht berücksichtigen, da die Standardbibliothek von Golang die zugrunde liegenden Details abschirmt.
Wenn Sie eine Binärversion veröffentlichen möchten, müssen Sie durch die oben genannte Kreuzkompilierung lediglich eine Version veröffentlichen, die mehrere Plattformen unterstützt.
Wenn das von Ihnen entwickelte Golang-Programm Systemaufrufe auf relativ niedriger Ebene verwendet (dies wird normalerweise normalerweise nicht empfohlen) und die Systemaufrufe verschiedener Plattformen unterschiedlich sind, müssen Sie die Frage der Unterstützung mehrerer Plattformen berücksichtigen. Sie können die Werte von runtime.GOOS und runtime.GOARCH im Programm dynamisch ermitteln und diese dann über if-else if- oder switch case-Anweisungen verarbeiten. Dies ist jedoch keine wünschenswerte Methode, da sie der Wartung nicht förderlich ist Der Code sieht hässlich aus. Der empfohlene Ansatz besteht darin, die Implementierungen für verschiedene Plattformen in verschiedenen Dateien abzulegen und dann dem Golang-Compiler mitzuteilen, welcher Plattform jede Datei entspricht. Hier gibt es zwei Methoden. Die erste Methode besteht darin, dies anhand des Dateinamens anzugeben:*_[GOOS]_[GOARCH].goSowohl GOOS als auch GOARCH sind im obigen Dateinamen optional. Angenommen, Sie haben unterschiedliche Implementierungen für Mac OS-, Linux- und Windows-Plattformen, können Sie diese drei Dateien wie folgt benennen: 🎜
yourfile_darwin.go yourfile_linux.go yourfile_windows.go🎜 Wenn Ihre Zielplattform dann Linux ist, wird nur yourfile_linux.go kompiliert. Wenn der Dateiname weder GOOS noch GOARCH enthält (z. B. yourfile.go), wird standardmäßig immer kompiliert. 🎜
另外一种办法是通过一个特殊的注释。例如,假设你想使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应该统一。
Das obige ist der detaillierte Inhalt vonUnterstützt Golang plattformübergreifend?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!