Golang::接口的值

旧城等待, 2022-05-18 05:14 270阅读 0赞

#

  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. )
  7. func show() {
  8. fmt.Println("hello")
  9. }
  10. func main() {
  11. var buf *bytes.Buffer
  12. interfaceParam(buf)
  13. }
  14. func interfaceParam(bufItf io.Writer) {
  15. if bufItf!= nil {
  16. fmt.Println("吃鲸!")
  17. } else {
  18. fmt.Println("预期结果!")
  19. }
  20. }

结果是啥呢,吃鲸!,buf 为nil,但是bufItf比较结果却不等于nil

概念上讲一个接口的值分为两部分:一部分是类型,一部分是类型对应的值,他们分别叫:动态类型和动态值。

当然可以从接口取出他的实际值来比较,但是这样限制了多态的实现

  1. package main
  2. 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("预期结果!") } }

最好的方法是先定义一个接口来存放变量,这样就能达到预期的效果

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. )
  6. func show() {
  7. fmt.Println("hello")
  8. }
  9. func main() {
  10. var buf io.Writer = nil
  11. // buf = new(bytes.Buffer)
  12. interfaceParam(buf)
  13. }
  14. func interfaceParam(bufItf io.Writer) {
  15. if bufItf != nil {
  16. fmt.Println("吃鲸!")
  17. } else {
  18. fmt.Println("预期结果!")
  19. }
  20. // fmt.Println(reflect.ValueOf(bufItf).Kind())
  21. // fmt.Println(reflect.ValueOf(bufItf).Type())
  22. }

参考

https://i6448038.github.io/2017/07/28/GolangDetails/
https://segmentfault.com/q/1010000010853947

发表评论

表情:
评论列表 (有 0 条评论,270人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golang:nil(空/零)

    在Go语言中,布尔类型的零值(初始值)为 false,数值类型的零值为 0,字符串类型的零值为空字符串"",而指针、切片、映射、通道、函数和接口的零值则是 nil。 nil

    相关 golang接口声明

    接口本身是调用方和实现方需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程。 golang使用组合实现对象特性的描述。对象的内部使用结构体

    相关 Golang 接口深入讨论

    一 点睛 1 Golang 接口中不能有任何变量。 2 一个接口(比如 A 接口)可以继承多个别的接口(比如 B、C 接口),这时如果要实现 A 接口,也必须将 B、C