范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

golang2021面向对象(10)基于指针对象的方法

  当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。对应到我们这里用来更新接收器的对象的方法,当这个接受者变量本身比较大时,我们就可以用其指针而不是对象来声明方法,如下:
  func (p *Point) ScaleBy(factor float64) {
        p.X *= factor
        p.Y *= factor
    }
  这个方法的名字是(*Point).ScaleBy。这里的括号是必须的;没有括号的话这个表达式可能会被理解为*(Point.ScaleBy)。
  在现实的程序里,一般会约定如果Point这个类有一个指针作为接收器的方法,那么所有Point的方法都必须有一个指针接收器,即使是那些并不需要这个指针接收器的函数。我们在这里打破了这个约定只是为了展示一下两种方法的异同而已。
  只有类型(Point)和指向他们的指针(*Point),才可能是出现在接收器声明里的两种接收器。此外,为了避免歧义,在声明方法时,如果一个类型名本身是一个指针的话,是不允许其出现在接收器中的,比如下面这个例子:
  type P *int
    func (P) f() { /* ... */ } // compile error: invalid receiver type
  想要调用指针类型方法(*Point).ScaleBy,只要提供一个Point类型的指针即可,像下面这样。
  r := &Point{1, 2}
    r.ScaleBy(2)
    fmt.Println(*r) //  "{2, 4}"
  或者这样:
  p := Point{1, 2}
    pptr := &p
    pptr.ScaleBy(2)
    fmt.Println(p) //  "{2, 4}"
  或者这样:
  p := Point{1, 2}
    (&p).ScaleBy(2)
    fmt.Println(p) //  "{2, 4}"
  不过后面两种方法有些笨拙。幸运的是,go语言本身在这种地方会帮到我们。如果接收器p是一个Point类型的变量,并且其方法需要一个Point指针作为接收器,我们可以用下面这种简短的写法:
  p.ScaleBy(2)
  编译器会隐式地帮我们用&p去调用ScaleBy这个方法。这种简写方法只适用于"变量",包括struct里的字段比如p.X,以及array和slice内的元素比如perim[0]。我们不能通过一个无法取到地址的接收器来调用指针方法,比如临时变量的内存地址就无法获取得到:
  Point{1, 2}.ScaleBy(2) // compile error: can"t take address  of Point literal
  但是我们可以用一个*Point这样的接收器来调用Point的方法,因为我们可以通过地址来找到这个变量,只要用解引用符号*来取到该变量即可。编译器在这里也会给我们隐式地插入*这个操作符,所以下面这两种写法等价的:
  pptr.Distance(q)
    (*pptr).Distance(q)
  这里的几个例子可能让你有些困惑,所以我们总结一下:在每一个合法的方法调用表达式中,也就是下面三种情况里的任意一种情况都是可以的:
  不论接收器的实际参数和其形式参数是相同,比如两者都是类型T或者都是类型*T:
  Point{1, 2}.Distance(q) //  Point
    pptr.ScaleBy(2)         // *Point
  或者接收器实参是类型T,但接收器形参是类型*T,这种情况下编译器会隐式地为我们取变量的地址:
  p.ScaleBy(2) //  implicit (&p)
  或者接收器实参是类型*T,形参是类型T。编译器会隐式地为我们解引用,取到指针指向的实际变量:
  pptr.Distance(q) // implicit (*pptr)
  如果命名类型T(译注:用type  xxx定义的类型)的所有方法都是用T类型自己来做接收器(而不是*T),那么拷贝这种类型的实例就是安全的;调用他的任何一个方法也就会产生一个值的拷贝。比如time.Duration的这个类型,在调用其方法时就会被全部拷贝一份,包括在作为参数传入函数的时候。但是如果一个方法使用指针作为接收器,你需要避免对其进行拷贝,因为这样可能会破坏掉该类型内部的不变性。比如你对bytes.Buffer对象进行了拷贝,那么可能会引起原始对象和拷贝对象只是别名而已,实际上它们指向的对象是一样的。紧接着对拷贝后的变量进行修改可能会有让你有意外的结果。
   
  不管你的method的receiver是指针类型还是非指针类型,都是可以通过指针/非指针类型进行调用的,编译器会帮你做类型转换。
  在声明一个method的receiver该是指针还是非指针类型时,你需要考虑两方面的因素,第一方面是这个对象本身是不是特别大,如果声明为非指针变量时,调用会产生一次拷贝;第二方面是如果你用指针类型作为receiver,那么你一定要注意,这种指针类型指向的始终是一块内存地址,就算你对其进行了拷贝。熟悉C或者C++的人这里应该很快能明白。

续航322km几何EX3或被命名功夫牛每公里只需6分钱几何旗下的新能源车在国内市场中有着不错的口碑,此次全新推出的几何EX3定位A0级,在家用市场应该会有不错的表现,同时该车整体的设计十分具有活力气息,也符合当下年轻消费者的审美喜好。10。19万起售大空间捷途X90PLUS上市9月17日,捷途X90PLUS正式上市,新车共推出5款车型,售价区间为10。1913。99万元。新车定位旅行SUV,不仅有着大空间,更有科技感十足的家族PLUS系列设计风格。外观整百公里油耗4。1L,轩逸ePower将于9月29日首发近日,我们从东风日产官方获悉,东风日产全新的轩逸ePOWER将会在9月29日正式首发,轩逸ePOWER在造型方面与在售的燃油版车型基本保持一致。从外观来看,新车采用了日产最新的家族高管被实名举报违规招标沃尔沃的信任危机近日,北青北京头条的一则沃尔沃报道引爆汽车圈,文章提到因发现上司沃尔沃汽车大中华区销售公司售后服务副总裁方锡智,连同售后运营提升总监杨杰违规招标,同部门高管将二人实名举报至沃尔沃汽比瑞虎7更霸气,瑞虎7PLUS将于9月16日开启预售奇瑞瑞虎7PLUS是一款性价比不错的车型,此前已经在成都车展亮相,最近我们得到消息称,该车将会在9月16日开启预售,瑞虎7PLUS采用了时下流行的外观和内饰设计,并且搭载了奇瑞品牌家庭旅行出行首选,捷途X90PLUS将于9月17日上市最近我们从捷途官方获悉,捷途X90PLUS将于9月17日正式上市,新车定位旅行SUV,不仅有着大空间,更有科技感十足的家族PLUS系列设计风格。外观整体来看,捷途X90PLUS给人豪掷重金造的车如何?恒驰7无伪路试照曝出日前,网络曝出恒驰7无伪路试照片。之前有消息曝出,在顺利完成夏测和东测后,恒驰系列即将接近量产,此次无伪装的车型,很可能就是量产版。据此前官方公布的信息,恒驰7定位纯电动B级轿车,配置升级广汽本田VE1TA将于9月26日上市我们从相关渠道获悉,2022款广汽本田VE1TA系列将于9月26日上市。新车较老款车型在细节之处升级,续航里程为480km。另外,新车将在外观与内饰的细节设计上有所升级,同时部分配特斯拉车主首例维权胜诉判定退一赔三我胜诉了,北京二中院维持一审原判,特斯拉存在欺诈,驳回上诉,退一赔三。维权历时755天。近日,特斯拉车主韩先生在微博发文宣告了这一消息。2019年韩先生在特斯拉官方网站以37。97比锐界还霸气,江铃福特领裕将于9月13日上市最近,我们从江铃福特官方获悉,新车领裕将于9月13日上市,将会采用223布局的7座版车型,目前领裕提供5座版6座版以及232布局的7座版布局。从外观设计来看,福特领裕采用六边形的中全新思域部分配置曝光,9月24日正式上市现款在售的十代本田思域,凭借极富视觉冲击力的造型设计与1。5T的强劲动力系统,自上市以来便成为了引爆市场的重磅运动车型,被同级竞品充当为最强有力的攀登目标。近日,我们从相关渠道获得
都说骁龙870手机性价比高,唯独有一个短板让人很纠结说起当下最热门的手机处理器,当属于高通骁龙870与高通骁龙888。一个性能好,发热适中一个性能处于顶级水准,谁能控制发热谁就是赢家。市面上的手机,搭载骁龙870处理器的,基本都定位风度翩翩不怕冻,飞乐思发热围巾体验,科技与时尚的结合时至大雪时节,天气渐冷,防寒保暖成为本季穿搭的主要任务。特别是在北方地区,出个门里里外外几件必不可少。穿搭上难免显得臃肿,毫无时尚感可言,这对追求时尚的年轻一代来说,简直太受罪。有九州风神水元素360ARGB水冷体验,让机箱沉浸幻彩空间2020年渐渐迎来尾声,在这一年里,科技的更新与发展潜移默化的走进我们的生活。有时,不知不觉就落伍了。不仅仅使用的产品跟不上时代,就连思想也常常是止步不前。曾有个内蒙古的朋友开玩笑Dyplay降噪精英耳机体验,独特设计,宽频主动降噪主动降噪,在最近的几年中逐渐走进我们的日常生活之中,这得益于各品牌的宣传,也由于技术的升级与成本的降低。主动降噪耳机起初,诞生于航空,用于屏蔽飞行中的噪音,以便商旅人士得到更好的休进销存领域唯一!秦丝荣获中国服装协会店铺解决方案推荐项目新一轮技术变革及其应用在全球范围内迅速孕育兴起,推动着服装行业向数字化智能化转型。秦丝科技为中国超过200万批零商户提供了完善的解决方案,引领着行业发展,助力万千服装实体商户转型。看懂了,服装行业的淡旺季一目了然!做好复盘带你拯救销售额又到了客户捡便宜,商家店内夏秋交替大清仓的时候。商家辛苦赚来的钱,都在仓库里面,库存成为庞大的负担,不利于店铺长期的发展,先来了解和服装行业息息相关的淡旺季,再就活动最后的数据,进什么是网桥,用在哪些领域?网桥(Bridge)像一个聪明的中继器。中继器从一个网络电缆里接收信号,放大它们,将其送入下一个电缆。相比较而言,网桥对从关卡上传下来的信息更敏锐一些。网桥是一种对帧进行转发的技术保安出身成深圳金融大佬,身价从2千变百亿,却因P2P涉黑一夜覆灭深圳素来是一个藏龙卧虎之地,其中最有名的坊间传言是保安变金融大佬,这样的故事一直被人津津乐道。然而随着去年深圳中科创金融控股集团董事长张伟的锒铛入狱,最终这个传言不再成为励志故事,又一快递公司被淘汰?144家加盟商被撬走,10天不派件已屡见不鲜双11将至,很多朋友在微信群里提醒购物时不要让商家选择圆通派送。作为三通一达成员之一,圆通快递还获得了阿里巴巴的投资,圆通到底怎么了?这不得从近期圆通全国性的快递积压问题说起。依靠昔日包头首富自焚往事借14亿做豆奶生意,贷款利息最高96今年以来,国内的公司很多出现了资金链断裂的状况,比如恒大地产和华夏幸福地产,还有紫光集团等,这些公司虽然资金链断裂,但是公司还是有较好的盈利性,因此国家尽力推行破产重整,从而改善公克服欲望战胜自己行情来了,持有的股票涨了,而且涨得很多,怎么办呢?拿着自己的股票问别人,总是求不得真经。股市的钱是挣不完的,但能亏的完(融资被平仓)。我是小小散,但却是老韭菜,入市很久来了。现在不