分享
  1. 首页
  2. 文章

Fourth glance in Go

moonz-wu · · 3330 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在Go里面的结构体和方法是很有意思的内容。它即和OO有点像,但又不完全一样。为什么这么说呢?当你把结构体映射为OO里面的类的时候,你给结构体添加方法,你就会发现其实方法与结构体并没有严格意义上的关系。在Go里面,方法是绑定到接受者上的。什么是接受者?一个对象,这个对象可以是任何类型,int,string, struct, interface ...。

func (t *Type) method_name(parameters) return type

但是同名的方法,在同一个类型上只能出现一次。而且该类型必须与方法在同一个包中。

另外一点是内嵌结构体的问题,方法是可以被继承的。也就是说一个结构体被内嵌到另一个结构体中,那么父结构体也就具有了内嵌结构体的方法

>>person.go
-------------------------------------------
package person
type Person struct {
 firstName string
 lastName string
}
type BlackMan struct {
 Person
 color string
}
func (p *Person) FirstName() string {
 return p.firstName
}
func (p *Person) SetFirstName(newName string) {
 p.firstName = newName
}
>>main.go
--------------------------------------------------
package main
import (
 "./person"
 "fmt"
)
func main() {
 p := new(person.BlackMan)
 p.SetFirstName("Ace")
 fmt.Println(p.FirstName())
}

一张图说明OO里面的继承体系与Go里面的继承体系区别

发现一个奇怪的问题:使用相同的方法去分配内存,得出的结果却截然不同

func main() {
 var n [1024 * 1024 * 1024]int
 n[0] = 1
 m := new(runtime.MemStats)
 runtime.ReadMemStats(m)
 fmt.Printf("%d\n", m.Alloc/1024)
}

这样程序的输出是占用8G空间,如果是1024 * 1024,输出则是 36K的空间占用。为什么?

Go中接口的指针方法和值方法的区别:

Pointer methods can be called with pointers.
• Value methods can be called with values.
• Value-receiver methods can be called with pointer values because they can be dereferenced
first.
• Pointer-receiver methods cannot be called with values, however, because the value stored
inside an interface has no address.

Go的面向对象总结

在Go里面是没有类的概念的,类型和方法是松耦合的,通过接口让他们链接在一起。

OO里面三个重要的概念:封装,继承和多态,在Go里面是这样对应的

封装(数据隐藏):其他的OO语言有4个访问级别,在Go里面只有2种

1. 包级:对象在整个包的范围内可见,以小写字母开头

2. 被导出:对象在包外可见,以大写字母开头

一个类型可以只有方法定义在它的包里。

继承:通过内嵌的一个或多个类型来达到多继承的目的

多态:接口,一个类型变量可以被分配给它的任意接口实现的实例。类型和接口是松耦合的, 多继承可以通过实现多个接口来完成。Go的接口不是Java或C#接口的变体, 它们更加的独立并且是大规模编程,鲁棒性和演变设计的关键


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:moonz-wu

查看原文:Fourth glance in Go

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3330 次点击
1 回复 | 直到 2025年04月29日 22:00:06
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏