我正在掌握Golang的处理方式。对于可能在以下方面提供帮助的任何人,我将非常感激。首先一些示例代码
package main
import (
"log"
"os"
)
func logIt(s string) {
f, _ := os.OpenFile("errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND,
0666)
defer f.Close()
log.SetOutput(f)
log.Println(s)
}
type iAm func(string)
func a(iam string) { logIt(iam + " A") }
func b(iam string) { logIt(iam + " B") }
func c(iam string) { logIt(iam + " C") }
var funcs = map[string]iAm{"A": a, "B": b, "C": c}
func main() {
funcs["A"]("Je suis")
funcs["B"]("Ich bin")
funcs["A"]("Yo soy")
funcs["D"]("Soy Yo")
}
说明
我是Go新手,因此我可能会受到其他使用语言的困扰。在我看来,以先发制人的方式处理特殊情况(在使用前先检查钥匙)既不明智也不有效。对?
每当我想记录某些内容时,我都不会打开和关闭文件。在启动时,我只需将其打开一次并将其设置为输出,然后在程序存在之前将其关闭。而且我不会使用logIt()
函数:仅使用log
包的函数进行日志记录,因此您可以进行格式化日志记录,例如使用log.Printf()
etc等。
一个功能图完全可以,并且在性能方面做得很好。如果您需要更快的速度,则可以switch
基于函数名称进行操作,然后直接在case
分支中调用目标函数。
中的值map
是函数值。函数类型的零值为,nil
并且您不能调用nil
函数,因此必须在继续调用之前检查该值。请注意,如果使用不存在的键索引地图,则返回值类型的零值(对于nil
函数类型)。因此,我们可以简单地检查该值是否为nil
。还有另一个逗号分隔的习惯用语,例如fv, ok := funcs[name]
,ok
将是一个布尔值,告诉您是否在地图中找到了密钥。
不过,您可以在一个地方完成此操作,而不必在每个调用中都重复该操作:
func call(name, iam string) {
if fv := funcs[name]; fv != nil {
fv(iam)
}
}
注意:
如果您选择使用switch
,则default
分支将处理无效的函数名称(当然,这里不需要函数映射):
func call(name, iam string) error {
switch name {
case "A":
a(iam)
case "B":
b(iam)
case "C":
c(iam)
default:
return errors.New("Unknown function: " + name)
}
return nil
}
在Go中,函数可以具有多个返回值,因此在Go中error
,即使函数通常具有其他返回值,您也可以通过返回值来传播错误。
因此,如果找不到指定的函数,则该call()
函数应具有error
返回类型以发出信号。
您可以选择返回error
由errors.New()
函数创建的新值(因此它可以是动态的),也可以选择创建全局变量并具有固定的错误值,例如:
var ErrInvalidFunc = errors.New("Invalid function!")
该解决方案的优点在于,call()
函数的调用者可以将返回error
的值与ErrInvalidFunc
全局变量的值进行比较,以了解是否存在这种情况并采取相应的措施,例如:
if err := call("foo", "bar"); err != nil {
if err == ErrInvalidFunc {
// "foo" is an invalid function name
} else {
// Some other error
}
}
(稍微压紧以避免垂直滚动条。)
package main
import ("errors"; "log"; "os")
type iAm func(string)
func a(iam string) { log.Println(iam + " A") }
func b(iam string) { log.Println(iam + " B") }
func c(iam string) { log.Println(iam + " C") }
var funcs = map[string]iAm{"A": a, "B": b, "C": c}
func main() {
f, err := os.OpenFile("errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
panic(err)
}
defer f.Close()
log.SetOutput(f)
call("A", "Je suis")
call("B", "Ich bin")
call("C", "Yo soy")
call("D", "Soy Yo")
}
func call(name, iam string) error {
if fv := funcs[name]; fv == nil {
return errors.New("Unknown funcion: " + name)
} else {
fv(iam)
return nil
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句