Heim Backend-Entwicklung Golang Unterstützt Golang plattformübergreifend?

Unterstützt Golang plattformübergreifend?

Jan 12, 2023 pm 05:14 PM
golang go语言

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.

Unterstützt Golang plattformübergreifend?

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.GOOSruntime.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
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

Cross-Compilation-Problem

Die Kompilierung von Golang-Programmen ist sehr einfach, ohne irgendwelche Kompilierungsoptionen zu berücksichtigen. Mit dem folgenden Befehl wird beispielsweise eine Binärdatei mit dem Namen „helloworld“ im aktuellen Verzeichnis generiert.

go build helloworld.go
Nach dem Login kopieren

Aber 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
Nach dem Login kopieren

Wie kann Ihr Paket mehrere Plattformen unterstützen?

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].go
Nach dem Login kopieren

Sowohl 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
Nach dem Login kopieren
🎜 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

......
Nach dem Login kopieren

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

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

// +build freebsd openbsd netbsd
Nach dem Login kopieren

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

// +build linux,386 darwin
Nach dem Login kopieren

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

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

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Apr 02, 2025 pm 02:03 PM

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Apr 02, 2025 pm 04:12 PM

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Apr 02, 2025 pm 12:57 PM

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Wie kann sichergestellt werden, dass die Parallelität beim Schreiben von Multi-Process-Protokollen sicher und effizient ist? Wie kann sichergestellt werden, dass die Parallelität beim Schreiben von Multi-Process-Protokollen sicher und effizient ist? Apr 02, 2025 pm 03:51 PM

Effizient behandeln Probleme mit der Parallelitätssicherheit beim Schreiben von Multi-Process-Protokoll. Mehrere Prozesse schreiben gleichzeitig die gleiche Protokolldatei. Wie kann die Parallelität sicher und effizient sichergestellt werden? Das ist ein ...

See all articles