当前位置: 首页 > news >正文

建设景区网站要有的内容厦门app制作

建设景区网站要有的内容,厦门app制作,微信小程序第三方平台,中国互联网小心类型嵌入导致的问题 在定义结构体时#xff0c;Go语言支持通过类型嵌入的形式定义结构体字段。但是#xff0c;如果我们没有真正理解类型嵌入的意义#xff0c;有时可能会导致意想不到的行为。本文将主要分析如何嵌入类型#xff0c;类型嵌入的作用以及可能出现的问题…小心类型嵌入导致的问题 在定义结构体时Go语言支持通过类型嵌入的形式定义结构体字段。但是如果我们没有真正理解类型嵌入的意义有时可能会导致意想不到的行为。本文将主要分析如何嵌入类型类型嵌入的作用以及可能出现的问题。 在Go语言中如果定义的结构体字段没有名称则称该字段为嵌入字段。例如下面结构体Foo中的Bar是嵌入的。因为Bar类型被声明没有关联名称所以它是一个嵌入字段。 type Foo struct {Bar } type Bar struct {Baz int }嵌入可以用来提升嵌入类型的字段和方法像上面的代码由于Bar包含一个Baz字段它被提升到Foo中就好像Foo中定义了一个Baz字段一样。 因此可以通过Foo直接访问Baz字段。 foo : Foo{} foo.Baz 42注意Baz可从两个不同的路径获得。既可以使用Foo.Baz,也可以通过Bar采用Foo.Bar.Baz获得两种方式获取的效果是等价的。 NOTE: 本文仅讨论结构体中字段嵌入问题。嵌入也可以用于接口一个接口内部可以嵌入其他接口。例如io.ReadWriter由一个io.Reader和一个io.Writer组成。 type ReadWriter interface {ReaderWriter }前面我们已分析了什么是类型嵌入下面来看一个错误使用类型嵌入的例子。该例子将实现一个结构体保存一些内存中的数据并且通过锁保护对它的并发访问。 type InMem struct {sync.Mutexm map[string]int } func New() *InMem {return InMem{m: make(map[string]int)} }将结构体 InMem 中的map m定为小写限制调用方直接操作m, 而是通过导出的方法进行操作。互斥锁以内嵌的形式存在sync.Mutex), 获取结构体中数据的Get方法实现如下 func (i *InMem) Get(key string) (int, bool) {i.Lock()v, contains : i.m[key]i.Unlock()return v, contains }由于互斥锁是嵌入的我们可以直接从接收器i访问Lock和Unlock方法。前面说了这是一个错误的例子错误在什么地方呢由于sync.Mutex是嵌入类型Lock和Unlock方法将被提升。因此使用InMem的调用方也可以看到这两个方法. 这种由于内嵌导致的方法提升可能不是我们希望的在大多数情况下互斥锁是我们希望封装在结构体内部并且使外部客户端不可见的内容。因此在这种情况下不应该将其设置为嵌入字段。 m : inmem.New() m.Lock() // ??而应该是这样调整为非嵌入字段。由于mu不可导出它不能被外部客户端直接调用。 type InMem struct {mu sync.Mutexm map[string]int }现在来看另外一个例子这次使用嵌入类型是一种正确的做法。例子描述的是实现一个自定义的日志记录功能它包含一个io.WriteCloser 并对外暴露Write和Close两个方法。如果io.WriteCloser不是嵌入的需要下面这样编码。 type Logger struct {writeCloser io.WriteCloser } func (l Logger) Write(p []byte) (int, error) {return l.writeCloser.Write(p) } func (l Logger) Close() error {return l.writeCloser.Close() } func main() {l : Logger{writeCloser: os.Stdout}_, _ l.Write([]byte(foo))_ l.Close() }Logger必须提供一个Write和Close方法然后调用writeCloser进行真正的Write和Close. 但是如果将字段改为内嵌就不用为Logger创建Write和Close方法,实现代码如下。 type Logger struct {io.WriteCloser } func main() {l : Logger{WriteCloser: os.Stdout}_, _ l.Write([]byte(foo))_ l.Close() }从客户端角度看调用方式没有任何差别都是调用Write和Close方法。但是采用内嵌不用对Logger再做一层包装Logger继承了io.WriteCloser的方法所以Logger满足了io.WriteCloser接口。 NOTE:嵌入和OOP子类化有人对嵌入和OOP子类化区分不清楚这两者之间的主要区别是方法的接收者不同。下图左侧表示类型X嵌入在类型Y中而右侧类型Y继承类型X。通过嵌入Foo的接收者仍然是X而不是Y. 但是通过子类化Foo的接收者是Y而不是X。Go中的嵌入是组合关系而不是继承关系。详细分析参考http://sd.jtimothyking.com/2018/06/25/subclassing-vs-embedding-in-golang/ 总结对于类型嵌入我们需要知道它不是必须的这意味着无论什么时候我们都可以在不使用类型嵌入的情况下解决问题。使用类型嵌入大多数情况下是为代码编写方便。如果决定使用类型嵌入我们需要牢记下面两个原则 类型嵌入不应该仅用作一些语法糖来简化对字段的访问例如调用Foo.Baz()而不是调用Foo.Bar.Baz()如果这是唯一的目的不用使用类型嵌入。 类型嵌入不应该提升我们想要对外部隐藏的数据字段和行为方法。例如像本文的例子允许调用方访问应该对结构体保持私有的互斥锁。 NOTE:有些人会说在可导出的结构体上使用类型嵌入可能会导致代码在维护方面需要付出额外的功夫。的确将类型嵌入到导出的结构体中意味着在这种类型演变时保持小心。例如如果我们向内部类型添加一个新方法应该确保它不会破坏上面的第二个原则。因此为了避免这种额外的工作开发人员要防止将类型嵌入到公共结构体中。 牢记上述使用类型嵌入的原则合理地使用类型嵌入可以帮助我们避免带有额外转发方法的代码像上面的Logger中类型嵌入。但是不要为了用而用不要将隐藏数据字段和方法约束丢给调用方使用时要有充分的理由。
http://www.zqtcl.cn/news/774992/

相关文章:

  • 怎么添加网站背景音乐定制建站
  • 西安网站建设和推广公司php企业网站开发实训报告
  • 市网站制作番禺绿叶居
  • 网站漂浮物怎么做电子商务网站开发实训体会
  • 电商网站建设定制济南网站建设及推广
  • 网站标签化wordpress 输出评论内容 函数
  • 明星个人网站设计汕头网络推广公司
  • 深圳有哪些做网站公司好武夷山建设局网站
  • 怎么设立网站赚广告费一个网站可以做多少关键字
  • 网站刚建好怎么做能让百度收录成都定制网站建
  • thinkphp网站开发技术做电脑租赁网站
  • 网站设计评语中午版wordpress
  • 邢台企业手机网站建设汕头网站制作后缀
  • 微网站后台内容设置做网站语言排名2018
  • 嘉兴网站制作网站建设外贸营销推广平台有哪些
  • 网站开发集广州高端网站定制开发价格
  • 网站开发培训成都网站建设 报价单 doc
  • 苏州哪里有做淘宝网站的WordPress模板博客主题
  • 网站做中转做任务 网站
  • 深圳住房建设局网站网站的建设教程
  • 6免费建站的网站在线建筑设计
  • 哪些网站做任务可以赚钱的建设厅网站如何查询企业信息
  • 深圳网站设计+建设首选深圳市服装网站建设需求分析报告
  • 肥城网站制作浙江省建设厅信息港官网
  • 手机网站建设进度南宁企业网站设计
  • 建设学校网站方案大淘客网站上的推广怎么做
  • 哪个网站可以免费学设计南阳网站建设页面
  • 外贸公司建网站一般多少钱南京网站建设小程
  • 洛阳霞光做网站公司手机编程教学
  • 深圳正规网站建设公司顺德网页制作公司