📜  Golang 中的类和对象

📅  最后修改于: 2021-10-25 03:03:54             🧑  作者: Mango

每个人(不包括婴儿)都可以与封装相关,而不管他/她对封装的先验知识如何。你想知道为什么吗?简单的。回忆你生病的所有时间,医生给你开了几天那些可怕的胶囊剂量,直到你康复!邪恶的胶囊包含了所有神秘元素,它们以某种方式神奇地融入了那个小胶囊!!有没有想过胶囊里面的内容?我们只看到胶囊的外部结构,老实说,我们没有人能通过观察它的结构来判断它到底装了什么。对?好吧,出乎你的意料,这就是我们所说的封装

想知道为什么我们将封装引入关于类和对象的文章中吗?好吧,类是封装的极好实现。胶囊将患者的药物元素绑定在一起,而类为程序员和用户绑定多行语句和/或函数!你知道最有趣的部分是什么吗? 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 终端上的可视化演示:

Golang 中的类和对象