Проблема с использованием экспортированного типа функции с типами C в качестве параметров

РЕДАКТИРОВАТЬ: изменил название, чтобы лучше отражать проблему благодаря @Not_a_Golfer

Я экспериментировал с Go и не могу понять эту проблему.

Следующее прекрасно работает, когда оно содержится в основном пакете:

// Define a callback-function type, and define an invoker for it
type Callback func(i C.int, d C.double)
func Invoke(cb Callback, i C.int, d C.double) {
        cb(i, d)
}
//... then define my callback and pass it into the invoker
func foo(i C.int, d C.double) {
        fmt.Printf("i %d d %f\n", i, d)
}
func main() {
        Invoke(foo, 2, 2.2)
}

Но когда я определяю type Callback а также Invoke в пакете, импортируйте пакет в основную и вызывайте mypkg.Invoker(foo, 2, 2.2) Я получаю следующую ошибку сборки:

src/hello/hello.go:9: cannot convert foo (type func(C.int, C.double)) to type mypkg.Callback

Изменить: вот основной код для пакета привет. Я структурировал все так, чтобы я мог использовать go команда для сборки / установки:

package main
import "C"
import "mypkg"
import "fmt"
func foo(i C.int, d C.double) {
        fmt.Printf("i %d d %f\n", i, d)
}
func main() {
        mypkg.Invoke( mypkg.Callback(foo), 2, 2.2 )
}

Кто-нибудь знает, нужно ли делать что-то особенное для типа, экспортируемого из пакета? Я использую типы C в аргументах, потому что в конечном итоге это будет оболочка вокруг C-библиотеки, и я просто хотел убедиться, что типы C не являются частью проблемы, сопоставляющей мою функцию обратного вызова с типом обратного вызова.

Вот код пакета:

package mypkg
import "C"
import "fmt"
type Callback func(i C.int, d C.double)
func Invoke(cb Callback, i C.int, d C.double) {
        fmt.Println("Calling cb\n")
        cb( i, d )
}

1 ответ

Они на самом деле разные типы!

Измените свой код на:

package main

import "C"
import "mypkg"

func main() {
    a := 1

    mypkg.Inc(C.int(a))
}

мойпакет:

package mypkg

import "C"

func Inc(a C.int) C.int {
    return a + 1
}

Компиляция первого пакета приведет к ошибке: ./test.go:9: невозможно использовать C.int(a) (тип C.int) в качестве типа mypkg.C.int в аргументе mypkg.Inc

Другие вопросы по тегам