2015-09-04 77 views
0
// Each type have Error() string method. 
// The error built-in interface type is the conventional interface for 
// representing an error condition, with the nil value representing no error. 
// type error interface { 
// Error() string 
// } 

func (f binFunc) Error() string { 
    return "binFunc error" 
} 

func func_type_convert() { 
    var err error 
    err = binFunc(add) 
    fmt.Println(err) 
    fmt.Println(i) 
} 

我对上面的代码中的两个问题:转换功能型Golang

  • 我不知道为什么Error方法执行,当add功能转化为binFunc类型?
  • 为什么add函数的转换结果能够分配给err错误接口变量?
+4

请提供更详细的示例,请使用https://play.golang.org/。我只是不理解你。什么是'add',什么是'binFunc'? – RoninDev

回答

5

error是一个接口:

type error interface { 
    Error() string 
} 

这意味着,有一个方法的任何类型的:Error() string满足接口和可被分配给error类型的变量。

binFunc有这样的方法:

func (f binFunc) Error() string { 
    return "binFunc error" 
} 

在进入新的开发者有时会觉得迷惑,因为他们不知道这是可能的方法重视的不仅仅是结构更多。在这种情况下binFunc定义喜欢这样的:

type binFunc func(int, int) int 

所以这个工作的方式是你被允许转换具有相同签名的任何功能:(从spec

函数类型表示具有相同参数和结果类型的所有函数的集合。

因此,如果你创建一个函数add

func add(x, y int) int { 
    return x + y 
} 

你被允许将其转换成binFunc

binFunc(add) 

因为binFunc我们上面定义的Error方法和,我们然后可以将这个新的binFunc分配给error类型的变量:

var err error 
var bf binFunc = binFunc(add) 
err = bf 

fmt.Println的行为是调用.Error()上错误for you

  • 如果操作数实现了错误接口,Error方法将被调用以转换将对象转换为字符串,然后根据动词的要求对其进行格式设置(如果有的话)。
  • 因此,要回答你的问题:执行

    • Error方法,因为fmt.Println查找error类型的参数,调用.Error()并打印生成的字符串。
    • 您可以将binFunc s分配到err,因为binFunc有一个Error方法。您不能将add直接分配给err,因为它没有Error方法。但是您可以将add转换为binFunc,因为它们具有相同的功能签名,通过这样做,您可以将其分配给err变量。
    +1

    很好的解释,谢谢 – christian