2025年3月28日 星期五 甲辰(龙)年 月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Go语言

Golang 中基于接口的适配器

时间:12-14来源:作者:点击数:4

假设有两个接口类型如下:

  • type I1 interface { Val1() string }
  • type I2 interface { Val2() string }

然后有结构体如下:

  • type T struct {}
  • func (t *T) Val1() string { return "t val1" }
  • func (t *T) Val2() string { return "t val2" }

现在定一个I1的包装器

  • type Wrapper struct {I1}

使用这个包装器

  • t := T{}
  • wrap := Wrapper { t }

问题是:通过 wrap 可以直接访问I1接口定义的方法,但是传递的对象t也实现了I2接口,但是无法通过 wrap 访问I2的接口方法:

  • wrap.Val1() // OK!
  • t.(I2).Val2() // OK!
  • wrap.(I2).Val2() // Panic!

有什么办法能让 wrap.(I2).Val2() 可以干活不?

于是 golang adapter interface 谷歌一番,得到一些结果:

proposal: Go 2: interface adapter types 说明 go 目前还不直接指出这种使用方式,有人在提 proposal,但是被关闭了(拒了),俱乐不要紧,评论信息还是值得看一下的

Interface wrapping method erasure(link:https://medium.com/@cep21/interface-wrapping-method-erasure-c523b3549912)

  • // WrapWriter wraps an http.ResponseWriter, returning a proxy that allows you to
  • // hook into various parts of the response process.
  • func WrapWriter(w http.ResponseWriter) WriterProxy {
  • _, cn := w.(http.CloseNotifier)
  • _, fl := w.(http.Flusher)
  • _, hj := w.(http.Hijacker)
  • _, rf := w.(io.ReaderFrom)
  • bw := basicWriter{ResponseWriter: w}
  • if cn && fl && hj && rf {
  • return &fancyWriter{bw}
  • }
  • if fl {
  • return &flushWriter{bw}
  • }
  • return &bw
  • }

结论是,目前还不能直接那么玩。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐