亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 從包中導入方法

Golang 從包中導入方法

Go
慕容708150 2021-11-29 15:46:14
現在我決定在我的 Go 程序中使用水平記錄器。此時是logrus。但是經過一番調查(痛定思痛)發現loggers很多:glog、log15、logrus等。所以,現在我想嘗試使用 logrus 并且有可能在另一個上更改它而不修復我使用 log 的所有源。我嘗試創建自己的包記錄器,它只導入 logrus:package loggerimport "github.com/Sirupsen/logrus"func init() {    logrus.SetFormater(new(logrus.TextFormater))    }在我的所有其他來源中,我想以這種方式使用 i:// main.gopackage mainimport log "logger"func main() {   log.Print(...)   log.Debug(...)   and so on}但是編譯器告訴我在 logger 包中沒有這樣的方法。有沒有辦法只將一些包 A 導入我自己的包 B 并在我的代碼中使用 A 到 B 的所有方法?我需要這樣做的原因是將來有機會快速將 logrus 更改為其他記錄器,這些記錄器支持相同的方法,只需替換我自己的記錄器文件中的幾行代碼,而無需替換導入日志上的導入日志“github.com/Sirupsen/logrus”所有來源的“github.com/some_bestlogger”
查看完整描述

3 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

你可以logger僅僅為了它的副作用而導入你的包,并且仍然直接使用 logrus 包:


package main


import (

    log "github.com/Sirupsen/logrus"

    _ "logger"

)


func main() {

    log.Print()

    log.Debug()

}

如果您確實希望能夠通過“logger”包直接調用這些日志函數,則需要定義這些函數并將它們在內部委托給“logrus”包。


查看完整回答
反對 回復 2021-11-29
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

將來有機會快速將 logrus 更改為其他支持相同方法的記錄器

你永遠不會切換到其他任何東西,因為每個記錄器都有不同的方法集。例如 log15 沒有Print方法,但是Info. 以及完全不同的記錄字段(鍵值對)的方法。您擔心更改單個導入行,但實際上您需要更改使用記錄器的每一行。

如果您希望能夠輕松地在日志包之間切換,您需要想出自己的日志接口(或使用最適合您的接口)并在幕后使用您選擇的日志包。只有這種方法才能使您能夠最大限度地減少所有代碼的更改。

您還可以在您的庫中提供一個接口,然后提供一個使用特定實現的默認記錄器。請注意,我知道的所有記錄器包都提供了某種記錄器結構(例如logrus.Logger),您可以將其附加到您的界面。然后,您可以log = logger.New()在整個應用程序中使用,而不是在導入時更改包名稱。

如果您不接受這些論點并想走自己的路,從我的角度來看,您只需要一個alias。您可以 fork 一個日志庫并在您的代碼中使用自己的 fork(這將允許您在不影響導入器的情況下完全更改行為)或簡單地將您想要的導入路徑符號鏈接到 logrus(盡管這不適用于go get) .


查看完整回答
反對 回復 2021-11-29
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

我認為你需要的是一個界面。這是一個非常簡單的例子。


package main


import (

    "os"


    "github.com/Sirupsen/logrus"

)


func init() {

    // Output to stdout instead of the default stderr

    // Can be any io.Writer, see below for File example

    logrus.SetOutput(os.Stdout)

}


type logInterface interface {

    Print()

}


type MyLogger struct{}


func (ml MyLogger) Print() {

    logrus.WithFields(logrus.Fields{

        "animal": "walrus",

        "size":   10,

    }).Info("A group of walrus emerges from the ocean")

}


func main() {

    mylogger := MyLogger{}


    mylogger.Print()

}

這樣,您可以將 logrus 替換為任何其他日志記錄包,您只需要更新 Print 函數,而不必更改調用 Print 函數的代碼。


查看完整回答
反對 回復 2021-11-29
  • 3 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號