-1

のようなビルトインlogおよびlog.Logger提供しErrorないWarningメソッドPython

Loggerしたがって、次のコードを使用して組み込み型用に作成したいと思います。

func (l *Logger) Error(v interface{}) {
    info := fmt.Sprintf("ERROR: %v", v)
    l.Println(info)
}

そして、上記のコードを のmorelog.go下のファイルに入れましたGOPATH/src/log

そして、main.go私は書いた:

logger := log.New(os.Stdout, "Test", 1)
logger.Error("Error in main.")

を実行するgo buildと、次のようになります。

./main.go:124: logger.Error undefined (type *log.Logger has no field or method Error)

新しい型を定義し、その型にメソッドを定義することで、同様の目標を達成できることを私は知っています。でも、組み込み型に直接メソッドを追加できればもっといいと思います。

4

3 に答える 3

5

これらの答えは両方とも正しいので、さらにいくつかの選択肢を紹介します。定義していない型にメソッドを定義することはできません。関数は確かにこれを行うことができる1つの方法ですが、型を再定義するか、型をラップすることによってこれを行うこともできます。

たとえば、出力ファイルの分割を気にせず、ログ行を変更したい場合は、これらのいずれかを実行できます。

タイプを再定義します。

type MyLogger log.Logger

func (l MyLogger) Info(msg string, args ...interface{}) {
    log.Logger(l).Printf(msg, args...)
}

func (l MyLogger) Error(msg string, args ...interface{} {
    log.Logger(l).Printf("ERROR: " + msg, args...)
}

またはタイプをラップします。

type MyLogger struct {
  log.Logger
}

func (l MyLogger) Info(msg string, args ...interface{}) {
  l.Printf(msg, args...)
}

func (l MyLogger) Error(msg string, args ...interface{}) {
  l.Printf("ERROR: " + msg, args...)
}

タイプを再定義すると、そのタイプで呼び出すことができるメソッドセットが定義したものに制限されます。最初にキャストしないと、*Printfメソッドを再利用することはできません。埋め込みによって型をラップすると、* Printfメソッドを呼び出して、それらのメソッドを独自のメソッドでラップできるようになります。この例は、各ケースのInfoメソッドとErrorメソッドの実装で確認できます。

于 2013-01-02T19:24:28.590 に答える
4

Rputikar は、基本的な質問に対する答えで正しいです。作成していない型に新しいメソッドを定義することはできません。

その場合の解決策の 1 つは、メソッドにこだわるのではなく、単純な関数を作成することです。関数として記述したいメソッドを次に示します。

Edit2: Spirit Zhang が正しく指摘したように、このコードの最初のバージョンでは、Lshortfile または Llongfile フラグの場合に行番号が失われました。これは改善です:

func LogError(l *log.Logger, v interface{}) {
    l.Output(2, fmt.Sprint("ERROR: ", v))
}

プレイグラウンドでの完全な作業例: http://play.golang.org/p/MJaKQLt24L

このコードを morelog.go に配置すると、メイン プログラムのあるディレクトリに morelog.go を配置できます。または、いくつかの小さな関数用に別のファイルを用意する必要はありません。LogError と LogWarning のコードを、メイン プログラムと同じファイルに配置するだけです。

編集: デフォルトのロガーを使用した例: Edit2:この例は、Lshortfile または Llongfile では機能しません。 人々が問題を見ることができるように、ここに残しておきます。これらの関数を記述してデフォルトのロガーを使用する簡単な方法がわかりません。

私の例は、任意のロガーで機能する LogError 関数を示しています。デフォルトのロガーのエラーをログに記録する必要がある場合は、さらに簡単です。

func LogError(v interface{}) {
    log.Printf("ERROR: %v", v)
}

あるいは、

func LogError(v interface{}) {
    log.Print("ERROR:", v)
}
于 2013-01-01T13:24:51.433 に答える
2

作成していない型のメソッドをオーバーライドすることはできません。同様に、作成していない型に新しいメソッドを定義することはできません。

必要に応じて、log.Logger の 2 つのインスタンスを警告用に 1 つ、エラー用に 1 つ持つことができます。

http://play.golang.org/p/DQjIvk-wfI

package main

import (
    "log"
    "os"
)

func main() {

    errorLogger := log.New(os.Stderr, "ERROR: ", log.LstdFlags)
    warnLogger := log.New(os.Stdout, "WARNING: ", log.LstdFlags)

    errorLogger.Println("Hello, playground")
    warnLogger.Println("Hello, playground")
}
于 2013-01-01T10:00:42.260 に答える