登录
首页 >  Golang >  Go问答

记录 printf 和 Write 方法

来源:stackoverflow

时间:2024-02-19 11:15:24 144浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《记录 printf 和 Write 方法》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我无法从下面的golang代码中获取我的生命,为什么当你在底部调用write函数时,

func write(message string) {
    log.printf("%v\n", message)
}

为什么 log.printf 调用下面的方法

func (fl filelog) write(data []byte) (int, error ) {
    fmt.println("does this ever get called?")
    f, err := os.openfile(string(fl), os.o_create|os.o_wronly|os.o_append, 0600)
    if err != nil {
        return 0, err
    }

    defer f.close()
    return f.write(data)
}

logger的printf定义如下

func (*logger) printf ¶

func (l *logger) printf(format string, v ...interface{})

-- 下面是完整代码,请有人向我解释一下为什么会这样--

package main

import (
    "fmt"
    stlog "log"
    "os"
)

var log *stlog.Logger

type fileLog string

func (fl fileLog) Write(data []byte) (int, error ) {
    fmt.Println("does this ever get called?")
    f, err := os.OpenFile(string(fl), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
    if err != nil {
        return 0, err
    }

    defer f.Close()
    return f.Write(data)
}

func registerHandlers() {
    var msgRaw = "how are you"
    write(msgRaw)
}

func run(destination string) {
    log =  stlog.New(fileLog(destination), "", stlog.LstdFlags)
}

func main() {
    fmt.Println("here we go")
    run("../test.log")
    registerHandlers()
}

func write(message string) {
    log.Printf("%v\n", message)
}

正确答案


记录器将日志消息写入 io.writer,该接口定义为:

type Writer interface {
   Write([]byte) (int,error)
}

filelog 类型实现 io.writer 接口,并将其设置为新记录器的输出。因此,每当记录器尝试写入日志时,它都会调用其写入器的 write 函数,即 filelog.write

今天关于《记录 printf 和 Write 方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>