我正在Mac上开发一个Go程序,它在Windows上安装了Parallels,这样我就可以在两个平台上进行测试。我的程序效果很好。我可以在我的Mac上编译Windows“.exe”文件并从Windows运行它,除日志文件外它运行良好。
我已将记录器设置为将其输出写入如下文件:
void validateSave() {
if (getObjectId() == null) {
throw new IllegalArgumentException("Cannot save a ParseUser until it has been signed up. Call signUp first.");
}
if (!isAuthenticated() && isDirty()) {
throw new IllegalArgumentException("Cannot save a ParseUser that is not authenticated.");
}
}
其中projectsLog在其上面声明,如下所示:
log.SetOutput(projectsLog)
我正在使用log.Printf语句,因为我想要格式化输出。示例如下所示:
projectsLog *os.File
这在Mac上运行良好。使用log.Printf的每一行都记录在一个单独的行上,但在Windows上,换行符不显示,我得到一行没有换行符。我很清楚unix和windows之间的“\ r”和“\ r \ n”区别。但是我认为log.Printf会根据它运行的平台运行得恰到好处吗?
如果我的假设是错误的,那么我有哪些选项可以确保日志文件在Windows上可读?如果可以的话,我不想传递旗帜,例如 - 平台窗口或某些东西。这可以透明的方式处理吗?
答案 0 :(得分:0)
如上所述,fmt
包始终使用\n
作为换行符"序列"无论操作系统如何(在Windows上也是如此)。 log
包使用了fmt
,因此同样适用于log
。当调用不以...ln()
结尾的函数时(例如log.Printf()
),将\n
显式打印log.Printf()
,如Logger.Output()
所述(向\n
转发到)。
只需将\r\n
作为换行符处理即可。如果确实需要打印\r
,则必须通过在格式字符串的末尾添加log.Printf("This will be terminated by CR+LF\r") // \n is appended automatically
字符来手动处理,例如:
func winprintf(format string, a ...interface{}) {
log.Printf(format+"\r", a...)
}
您可以为它创建一个包装函数:
\r\n
请注意,这只会在日志条目末尾打印\n
;但是如果您在格式字符串中使用string
或参数为string
s(或者通过调用String()
方法生成\n
)\r\n
,那些不会自动变成age
。您也可以使用strings.Replace()
来处理这些问题。