版权声明:博客地址:blog.csdn.net/x356982611,未经允许不得转载,不得转载,不得转载 https://blog.csdn.net/x356982611/article/details/81287381
package main
import (
"bytes"
"fmt"
"io"
)
func show() {
fmt.Println("hello")
}
func main() {
var buf *bytes.Buffer
interfaceParam(buf)
}
func interfaceParam(bufItfio.Writer) {
if bufItf!= nil {
fmt.Println("吃鲸!")
} else {
fmt.Println("预期结果!")
}
}
结果是啥呢,吃鲸!,buf 为nil,但是bufItf比较结果却不等于nil
概念上讲一个接口的值分为两部分:一部分是类型,一部分是类型对应的值,他们分别叫:动态类型和动态值。
当然可以从接口取出他的实际值来比较,但是这样限制了多态的实现
package main
import (
"bytes"
"fmt"
"io"
)
func show() {
fmt.Println("hello")
}
func main() {
var buf *bytes.Buffer
interfaceParam(buf)
}
func interfaceParam(bufItfio.Writer) {
if bufItf.(*bytes.Buffer) != nil {
fmt.Println("吃鲸!")
} else {
fmt.Println("预期结果!")
}
}
最好的方法是先定义一个接口来存放变量,这样就能达到预期的效果
package main
import (
"fmt"
"io"
)
func show() {
fmt.Println("hello")
}
func main() {
var buf io.Writer = nil
// buf = new(bytes.Buffer)
interfaceParam(buf)
}
func interfaceParam(bufItf io.Writer) {
if bufItf != nil {
fmt.Println("吃鲸!")
} else {
fmt.Println("预期结果!")
}
// fmt.Println(reflect.ValueOf(bufItf).Kind())
// fmt.Println(reflect.ValueOf(bufItf).Type())
}
参考
https://i6448038.github.io/2017/07/28/GolangDetails/
https://segmentfault.com/q/1010000010853947