每个人(不包括婴儿)都可以与封装相关,而不管他/她对封装的先验知识如何。你想知道为什么吗?简单的。回忆你生病的所有时间,医生给你开了几天那些可怕的胶囊剂量,直到你康复!邪恶的胶囊包含了所有神秘元素,它们以某种方式神奇地融入了那个小胶囊!!有没有想过胶囊里面的内容?我们只看到胶囊的外部结构,老实说,我们没有人能通过观察它的结构来判断它到底装了什么。对?好吧,出乎你的意料,这就是我们所说的封装。
想知道为什么我们将封装引入关于类和对象的文章中吗?好吧,类是封装的极好实现。胶囊将患者的药物元素绑定在一起,而类为程序员和用户绑定多行语句和/或函数!你知道最有趣的部分是什么吗? Golang 中没有课程,但确实有!令人困惑?乍一看是这样。基本上 Go 没有关键字“类”,不像其他面向对象的语言,如 C++/ Java/ Python等……但是(这里有例外!!!) Go 支持类的全部功能。这就像 Go 支持类而不将其命名为类。
那么如果不能使用关键字class怎么办? Go 抢走了一个关键字,但返回了4 种不同类型的类实现。有趣的!让我们更深入地了解这 4 位魔术师的细节:
1.结构 (或者更确切地说是结构)
结构是用户定义的数据类型/结构。它们的工作方式与 C++/ Python等其他语言中的结构相同。普通结构体和隐式类的唯一区别是结构体由程序员定义,然后传递给函数或方法,然后进行处理。永远无法判断程序是否包含隐式将被视为类的部分,但 Go 支持 OOP(面向对象的编程系统),因此,尽管程序员的眼睛看不到名称和有组织的胶囊,我们坚信,我们可以以不同的方式在 GO 中执行所有 OOP 功能。
2. 嵌入
一种不太流行但有用的技术,它使用嵌入。顾名思义,它支持以特定方式嵌套结构。例如,您的 struct1 具有 a & b 内容。现在您希望创建一个包含 struct1 内容以及 c & d 的 struct2。在这种情况下,您可以简单地在 struct2 中提及 struct1 然后 c & d,这类似于内联函数逻辑!嵌入也由结构提供支持。作为类的隐式转换没有区别,只是结构很简单并且嵌套结构被称为嵌入式结构的情况。
3. 方法/函数
好吧,我们可以简单地创建自定义类型的函数,并且这些函数可以隐式地被视为一个类。你可以在 Go 的函数中学到的令人兴奋的新东西是函数有一个特定的接收器类型,并且它们只对那个非常特殊的类型进行操作;与 C++ 中的模板不同。
4. 接口
接口就像那些铁路站台,其中包含多列火车,有些火车往返于一个地方。是的,你没看错!接口将不能像在Java那样显式实现的各种方法集绑定在一起。关于 Go 中的接口需要注意的一个重要点是接口的名称必须以“ er ”结尾,这是 Go 的约定。 er前面的字符实际上是实现相同 name+ er接口的类型的名称。阅读下面的代码部分后,您将获得最大的清晰度。
For instance:
Line1: type X struct {}
Line1 is a simple demo of defining X class (indirectly)
对象可以与现实生活中的实体相关。正如对类的功能有规定但没有 class 关键字一样,Go 中的对象也是如此。可以使用特定的类类型实例化对象或更确切地说变量,并且可以像使用任何其他语言中的对象一样进一步使用该变量。
For instance:
Line2: obj := X()
Line2 is a simple demo of instantiating X class to obj (indirectly)
代码:类和对象的演示。
Go
package main
// Importing fmt package for the sake of printing
import (
"fmt"
)
// Animal is the name we want but since we are
// to use it as an interface, we will change
// the name into Animaler.
type Animaler interface {
// Note that we will
// declare the methods to be used
// later here in this
// interface
Eat()
Move()
Speak()
Error()
}
// A struct holding a string variable: SuperAnimals
type SuperAnimals struct {
locomotion string
}
// An embedded struct holding content
// from another stuct and two
// other string variables
// named Animals
type Animals struct {
SuperAnimals
food string
sound string
}
// Now we are indirectly implementing
// the Animaler interface without any
// keywords.
// We are about to define each method
// declared in the Animaler interface.
func (x Animals) Eat() {
// this method will access the variable
// food in Animal class
fmt.Println(x.food)
}
func (x Animals) Move() {
// this method will access the variable
// locomotion in Animal class
fmt.Println(x.locomotion)
}
func (x Animals) Speak() {
// this method will access the variable
// sound in Animal class
fmt.Println(x.sound)
}
func (x Animals) Error() {
fmt.Println("Invalid query entered!")
}
// Finally reached main function where we can
// now test our "GO classes"
func main() {
// Experiencing a dictionary / map in GO
// For the animal name as a key,
// that particular object is a value
m := map[string]Animals{
"cow": Animals{SuperAnimals{"walk"}, "grass", "moo"},
"Cow": Animals{SuperAnimals{"walk"}, "grass", "moo"},
"Bird": Animals{SuperAnimals{"fly"}, "worms", "peep"},
"bird": Animals{SuperAnimals{"fly"}, "worms", "peep"},
"Snake": Animals{SuperAnimals{"slither"}, "mice", "hsss"},
"snake": Animals{SuperAnimals{"slither"}, "mice", "hsss"},
}
for i := 0; i < 3; i++ {
fmt.Println("Enter animal name & query (eat / move / speak): ")
fmt.Print(">")
var animal, op string
fmt.Scan(&animal)
fmt.Print(">")
fmt.Scan(&op)
if op == "eat" {
m[animal].Eat()
} else if op == "move" {
m[animal].Move()
} else if op == "speak" {
m[animal].Speak()
} else {
m[animal].Error()
}
}
}
运行命令:
Directory where the GO file is present:/> go run (file_name).go
有效的测试用例 1:
输入:
Enter animal name & query (eat / move / speak):
>snake
>move
Enter animal name & query (eat / move / speak):
>bird
>eat
Enter animal name & query (eat / move / speak):
>cow
>speak
输出:
slither
worms
moo
无效的测试用例 2:
输入:
Enter animal name & query (eat / move / speak):
>snake
>drink
Enter animal name & query (eat / move / speak):
>cow
>eat
Enter animal name & query (eat / move / speak):
>dog
>talk
输出:
Invalid query entered!
grass
Invalid query entered!
Linux 终端上的可视化演示: