GO语言的模块化和面向对象
这是关于评论GO语言的第二部分,第一部分:,第三部分会在不日后在CSDN公众号(ID:csdnnews)发布。
在第一部分里面就GO语言的简单功能(特征)做了论述,如常用语法,基本类型等。本文将主要提及GO所支持的package(包)和面向对象。在这之前呢,还是建议读者阅读一下此书,照旧,欢迎各方高人点评和纠错。
总的来说,我发现GO语言面向对象的语法有点乱,一致性差、不明显,所以对于大多数使用场合,个人更倾向于C++明显的继承层次结构。
在这个部分的文章里面故意不提及系统构建,分发或者配置等内容。
Packages(包)
Go代码是以软件包的形式组织的,Java也有包的概念,二者很像,跟C++命名空间也有点类似。 在源文件的开头声明包的名称:
package foo
当需要用到某个包时,用import方式导入:
package bar //定义了包名
import ( //告诉Go编译器这个程序需要使用 foo、moo 包(的函数,或其他元素)
“foo”
“moo”
)
func somefunc() {
foo.Yadda()
var a moo.Thing
。。.
}
包名称应与文件的目录名称匹配。 这是import语句找到对应包的关键。一个目录可允许有多个文件,这些文件都是同一个包的一部分。
package main不受以上规则约束。由于其唯一性,所以对应的目录不需要命名为main。
结构体
在Go语言中可以像C一样声明一个结构体:
type Thing struct {
// Member fields.
// Notice the lack of the var keyword.
a int
B int // See below about symbol visibility
}
var foo Thing
foo.B = 3
var bar Thing = Thing{3}
var goo *Thing = new(Thing)
goo.B = 5
我习惯使用var关键字演示变量的实际类型,也可能会选择较短的表达式 := 。
请注意,我们可以将其创建为一个值或一个指针(使用内置的new()函数),与C或C ++不同,Go中的结构体所占的实际内存并不能确定是在堆还是栈上。 具体由编译器决定,一般是根据内存是否需要延续功能调用来分配。
以前,我们已经看到内置的make()函数用于实例化slices(切片)和maps(集合)。 make()仅适用于那些内置类型。 对于自定义类型,可以使用new()函数。 我发现这个区别有点混乱,但是我一般不喜欢使用语言本身就可以实现的类型区别。 我喜欢C++标准库如何在C++中实现方式,当往库里面添加内容时,语言本身几乎没有什么特别的支持。
Go类型通常具有“构造函数”(而不是方法),应该调用该函数来正确实例化该类型,但是我认为没有办法强制执行正确的初始化,就像C++或Java中的默认构造函数。 例如:
type Thing struct {
a int
name string
。。.
}
func NewThing() *Thing {
// 100 is a suitable default value for a in this type:
f := Thing{100, nil}
return &f
}
// Notice that different “constructors” must have different names,
// because go doesn‘t have function or method overloading.
func NewThingWithName(name string) *Thing {
f := Thing{100, name}
return &f
}
Embedding Structs(嵌套结构体)
可以匿名地将一个结构体“嵌入”到其他结构体中,如下所示:
type Person struct {
Name string
}
type Employee struct {
Person
Position string
}
var a Employee
a.Name = “bob”
a.Position = “builder”
这感觉有点像C ++和Java中的继承,例如,可以这样:
var e = new(Employee)
// Compilation error.
var p *Person = e
// This works instead.
// So if we thought of this as a cast (we probably shouldn’t),
// this would mean that we have to explicitly cast to the base class.
var p *Person = e.Person
// This works.
e.methodOnPerson()
// And this works.
// Name is a field in the contained Person struct.
e.Name = 2
// These work too, but the extra qualification is unnecessary.
e.Person.methodOnPerson()
Methods(方法)
Go语言中的结构体可以有Methods(与结构相关联的函数),这点和C/Java语言的classes(类)很像 , 但在语法方面略有不同。
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%
下载地址
GO语言的模块化和面向对象下载
相关电子资料下载
- golang语言的加密解密算法实现 41
- 解析Go语言的高级特性 56
- 微服务架构组件分析,看这篇就够了 285
- 基于Go语言的反弹Shell命令生成工具简介 116
- 什么是K3s和K8s?K3s和K8s有什么区别? 538
- Go能取代Python成为开发者的首选语言吗? 147
- Go语言中的整数类型 106
- Go语言常量的声明 141
- Go语言变量的命名和声明 191
- Go语言简介和安装方法 269