Есть ли способ построить источник go, включая struct type, для файла * .so? - PullRequest
3 голосов
/ 18 апреля 2019

Я создаю приложение, написанное на python.

В приложении мне нужна функция, предоставляемая языком go, поэтому я пытаюсь создать файл * .so, чтобы использовать его как локальныйlibrary.

Как мне собрать * .so с исходным кодом go-lang, содержащим struct-type.


Go версия: go версия go1.12.2 windows / amd64

python: Python 3.6.1 (v3.6.1: 69c0db5, 21 марта 2017 г., 18:41:36) [MSC v.1900 64 бит (AMD64)] на win32


До сих пор мне удавалось создать файл * .so с исходным кодом go-lang, просто имея простую функцию без какого-либо типа структуры,И это сработало, выполнив его через python-код.

Затем я добавил параметры структуры в код go, после этого попробовал тот же процесс сборки.Тем не менее, он никогда не работал, показывая некоторые сообщения, подобные этому.

# аргументы командной строки

. \ User_auth.go: 37: 16: Тип Go не поддерживается в экспорте: http.ResponseWriter

. \ user_auth.go: 37: 40: тип Go не поддерживается в экспорте: http.Request

. \ user_auth.go: 37: 16: тип Go не поддерживаетсяв экспорте: http.ResponseWriter

. \ user_auth.go: 37: 40: тип экспорта не поддерживается в экспорте: http.Request

Согласно здесь , cmd / cgo, кажется, не поддерживает это преобразование до 2017 года. Я не смог найти больше информации, чем указано выше.

・ Успешно (ok.go)

package main

import (
    "C"
)


func main() {
}

//export adder
func adder(a, b int) int {
    return a + b
}

・ Ошибка (wish_ok.go))

package main

import (
        "fmt"
        "net/http"
        "C"

        "google.golang.org/appengine"
        "google.golang.org/appengine/user"
)

func main() {
//  http.HandleFunc("/auth", welcome)
//
//  appengine.Main()
}

func init() {
//    log.Println("Loaded!!")
}

//export welcome
func welcome(w http.ResponseWriter, r *http.Request) {
        ctx := appengine.NewContext(r)
        u := user.Current(ctx)
        if u == nil {
                url, _ := user.LoginURL(ctx, "/")
                fmt.Fprintf(w, `<a href="%s">Sign in or register</a>`, url)
                return
        }
        url, _ := user.LogoutURL(ctx, "/")
        fmt.Fprintf(w, `Welcome, %s! (<a href="%s">sign out</a>)`, u, url)
}

Я ожидаю, что код go-lang, как указано выше, может быть выполнен python.Или другой способ получения информации о пользователе в gcp (gae-py3.X) приветствуется.

1 Ответ

0 голосов
/ 19 апреля 2019

Подпись функции, которую вы экспортируете из Go в C, должна содержать только типы C (или примитивные типы Go, которые можно автоматически преобразовывать в типы C, например int). В документации прямо говорится, что Типы структур Go не поддерживаются; используйте тип структуры C . (Это также обсуждено в проблеме, которую вы связали.)

Так вот почему вы не можете использовать http.ResponseWriter или *http.Request в сигнатуре вашей экспортируемой функции. Вам придется либо определить свои собственные типы C, чтобы представить HTTP-запрос и ответ (вероятно, болезненный), либо по-разному разбить вашу локальную библиотеку (например, определить отдельные функции loginURL и logoutURL, которые принимают и возвращают строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...