09. Go极简教程 结构体的函数扩展

Go 没有类。然而,仍然可以在结构体类型上定义方法。

结构体的函数扩展可以帮助我们实现类似面向对象的"类的封装"

给结构体扩展方法

package main

import (
    "log"
)

// Vertex -
type Vertex struct {
    X, Y float64
}

// Scale - 正确的例子
func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

// Small - 错误的例子
func (v Vertex) Small(f float64) {
    v.X = v.X / f
    v.Y = v.Y / f
}

func main() {
    // Scale 使用了 *Vertex 指针, 避免在每个方法调用中拷贝值(如果值类型是大的结构体的话会更有效率
    // 其次,方法可以修改接收者指向的值
    v1 := &Vertex{3, 4}
    v1.Scale(5)
    log.Println(*v1) // {15 20}

    // Small 方法没有使用指针, 函数里头的v是拷贝值, 每次修改的都是新的拷贝值, 所以v2没有被修改
    v2 := Vertex{3, 4}
    v2.Small(2)
    log.Println(v2) // {3, 4}
}

参考资料:
http://go-tour-zh.appspot.com/

Go极简教程 继续阅读( 目录)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,024评论 19 139
  • 转眼间已经来到上海十多天了,面对她,我依旧如刚来一般感到陌生与仿徨。如果要说有何不同,那便是彷徨更甚。 不知道是不...
    小张丶姑娘阅读 3,511评论 0 0
  • 如果我们不曾相遇,我仍然不知世间险恶,仍然不知人间冷暖。 2017年2月10日,在XDF最后一天兼职,之后决定辞职...
    伊恩希阅读 2,394评论 0 2
  • 本文虚构多,若有雷同,纯属巧合。 同名同姓,不算奇事,正如与我同名的人网上一查二十人都打不住, 但在我童年居住的小...
    活着不易阅读 3,616评论 3 11
  • 最近看《声临其境》被韩雪的英文实力圈粉, 咱们的女明星学习都这么刻苦, 咱们还不赶紧把英语给学起来! 现在正值寒假...
    Annie汪阅读 3,526评论 0 0

友情链接更多精彩内容