2017-05-01 5 views
1

TLDR:golangには方法がありますか(非標準的なビットであっても)、特定のパッケージの機能やインポートを「害する」ためです。ポイズニングA GOのパッケージ/機能

より長いバージョン:すべての一般向けの関数が結果を返すリラックスサービス、またはリリーフファイルで宣言された特定のタイプのエラーを記述しています。私が働いている誰かが、別の条件をチェックすることを決定し、その条件が満たされない場合は、このような何かをするまでは、

publicFacingFunc(...) (returnType, error) 

これは素晴らしいことだ:コードジェネレータは、このようなインターフェイスのためのコードを生成し

if conditionIsNotMet { 
    return nil, errors.New(...) 
} 

コードはコンパイルされますが、エラーが発生した場合、受信したメッセージは文書化されていないランダムな文字列です。したがって、これらのファイルでは、 "errors"と "fmt"パッケージの使用を防ぎたいと思っています。

はい、私は試してみましたが、ファイルの先頭にはぼんやりと警告が表示されていますが、誰も読んでいないようです。

ところで、パブリックエラーにはそれぞれ、これらのファイルの外部にあるそれぞれの「コンストラクタ」があり、私の場合はそれらを使用する必要があります。

答えて

0

ファイル内でのパッケージの使用のみに関心がある場合は、「NEVER」のような愚かな名前でインポートすることができます。人々はそれを使用することができますが、私は思うと思います。

import (
     NEVER "fmt" 
) 

OR、あなたはそれほど愚かになりたい場合は、_アンダースコアを使用することができ、輸入をロードしますhttps://golang.org/doc/effective_go.html#blank_import

import (
    _ "fmt" 
) 

、しかしそれだけではなく、明示的なため、つまり(副作用です使用。


ない特定のタイプのすべてのエラーの入力を停止するには、型アサーション、01との望ましくない種類を停止するためにreflectを使用することができますだから、

v, ok = x.(T) 

errはあなたが本当に強制する場合、それはエラーの種類を

specialError, ok := err.(mypackage.ErrorType) 
    if !ok { 
     // don't send this error on 
    } 
+1

私の場合は十分ですが、同じパッケージを複数回インポートすることができますので、このスキームを回避するのはやや簡単です。他の行で '' errors ''を' 'errors''として再宣言するのを防ぐレビュー以外には何もありません –

0

をチェックし、あなたが通過しないこと、公共の対面機能で起動した場合すべてのパッケージについてgo listの出力をチェックし、fmterrorsが直接インポートのリストにないことを確認するビルドステップを実行できます。しかし、このような共通のパッケージでは、完全に避けることは難しいかもしれません。 fmt.Errorfなどを検出するために詳細な解析を行うことはできますが、それは難しいかもしれません。

もっと侵略的な解決策は、それらのパッケージのパッケージソースを変更し、devsにカスタムgoディストリビューションを使用させることです。おそらく、標準ライブラリのどこにでも使用されているfmterrorsパッケージは文字通りどこでも使用できますが、他のパッケージでも動作する可能性があります。私はそれを絶対に勧めません。間違いなく、チェックインやPRなどのビルド時の検証として追加してください。

関連する問題