2017-11-03 10 views
-1

アンエクスポートパッケージの機能を呼び出すためにgolangは、例えば パッケージ機能のhello()が次のように定義されますどのようにアンエクスポートパッケージの関数を呼び出す方法

package testlib 

import "fmt" 

func hello() { 
    fmt.Println("Hello testlib") 
} 

、メインパッケージからが呼んでいる:

package main 

import (
    _ "reflect" 

    "testlib" 
) 

func main() { 
    testlib.hello() 
} 

もちろん、このプログラムは間違っています。パッケージを反映言及 私はGoogleで検索しているくらい、多くの人が同じように、アンエクスポート機能を呼び出すために使用することができます

obj := ... (some object) 
val := reflect.ValueOf(obj); 
fun := val.MethodByName("hello") 
fun.Call([]reflect.Value{}) 

しかし、すべての例は、オブジェクト(すなわち,.構造体)ではなく、パッケージに基づいています。 私の問題は、オブジェクト関数ではなく、パッケージ関数を呼び出すことです。ありがとう。

答えて

9

できません。これは、非公開関数の目的です。宣言しているパッケージだけが呼び出すことができます。

あなたがパッケージ作成者であり、他のパッケージから呼び出す必要がある場合は、エクスポートします。それがあなたのパッケージでないなら、それを呼び出すことはしないでください。これはパッケージのAPIの一部ではなく、実装の詳細なので、いつでも変更される可能性があります(変更される内容、署名の変更、名前の変更、またはいつでも完全に削除される可能性があります)。

+0

はい、わかりました。この種のAPIを呼び出す通常の解決策はありません。これがEXPORTの意味です。実際にはリフレクトパッケージを使用すると構造体のUNEXPORTED APIを呼び出すことができますが、これはパッケージのUNEXPORTED APIを呼び出すための同様のハックメソッドがあるかどうかを思い出させる方法です。ありがとう – Hui

+0

@Hui別のパッケージから非エクスポート関数を呼び出す異常な方法はありません。 – icza

+0

入手しました。ありがとう。 – Hui

関連する問題