Rumah >pembangunan bahagian belakang >Golang >Bolehkah perduaan Go memuatkan dan memautkan kod Go yang disusun secara luaran secara dinamik semasa masa jalan?

Bolehkah perduaan Go memuatkan dan memautkan kod Go yang disusun secara luaran secara dinamik semasa masa jalan?

Susan Sarandon
Susan Sarandonasal
2024-12-06 07:59:13787semak imbas

Can Go binaries dynamically load and link externally compiled Go code at runtime?

Pemuatan Dinamik dan Pautan daripada Perduaan Go

Pernyataan Masalah:

Memandangkan binari Go yang disusun, adakah mungkin untuk menyusun fail Go luaran secara dinamik dan memautkannya ke binari sedia ada untuk segera pelaksanaan?

Penyelesaian:

Keupayaan untuk mencipta perpustakaan kongsi, yang membolehkan pemuatan dan pemautan dinamik, telah diperkenalkan dalam Go versi 1.5 pada Ogos 2015.

Langkah untuk Membina dan Memaut Secara dinamik:

  1. Buat Pustaka Dikongsi:

    • Kompilasi fail Go luaran sebagai perpustakaan kongsi menggunakan -buildmode=shared bendera:

      go install -buildmode=shared my_library.go
  2. Bina Perduaan dengan Pautan Dinamik:

    • Kompilkan Langkah binari yang akan memuatkan dan memautkan perpustakaan kongsi menggunakan fail -linkshared bendera:

      go build -linkshared main.go

Contoh:

Pertimbangkan kod berikut dalam main.go:

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("my_library.so")
    if err != nil {
        fmt.Println(err)
        return
    }

    runFoo, err := p.Lookup("RunFoo")
    if err != nil {
        fmt.Println(err)
        return
    }

    runFoo.(func())() // Call the exported function from the shared library
}

Nota: Pustaka kongsi mesti mengeksport fungsi RunFoo menggunakan //eksport RunFoo dalam kod sumber Go.

Atas ialah kandungan terperinci Bolehkah perduaan Go memuatkan dan memautkan kod Go yang disusun secara luaran secara dinamik semasa masa jalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn