面向对象编程是一种使用“对象”的思想来表示数据和方法的编程范式。Go 不严格支持面向对象,但它是一种轻量级的面向对象语言。Golang 的面向对象编程不同于其他语言,如 C++ 或 Java ,原因如下:
1.结构体
Go 不支持通过类的自定义类型,但支持结构。Golang 中的结构是用户定义的类型,只保存状态,不保存行为。结构可用于表示包含多个键值对的复杂对象。我们可以向结构中添加函数,这些函数可以向结构中添加行为,如下所示:
示例:
// Golang program to illustrate the
// concept of custom types
package main
import (
"fmt"
)
// declaring a struct
type Book struct{
// defining struct variables
name string
author string
pages int
}
// function to print book details
func (book Book) print_details(){
fmt.Printf("Book %s was written by %s.", book.name, book.author)
fmt.Printf("\nIt contains %d pages.\n", book.pages)
}
// main function
func main() {
// declaring a struct instance
book1 := Book{"Monster Blood", "R.L.Stine", 131}
// printing details of book1
book1.print_details()
// modifying book1 details
book1.name = "Vampire Breath"
book1.pages = 162
// printing modified book1
book1.print_details()
}
输出:
Book Monster Blood was written by R.L.Stine.
It contains 131 pages.
Book Vampire Breath was written by R.L.Stine.
It contains 162 pages.
2.包装
这意味着对用户隐藏敏感数据。在 Go 中,封装是通过将字段、方法和函数大写来实现的,这使得它们成为公共的。当结构、字段或函数公开时,它们在包级别导出。公共和私人成员的一些例子有:
package gfg
// this function is public as
// it begins with a capital letter
func Print_this(){
// implementation
}
// public struct
type Book struct{
// public field
Name string
// private field, only
// available in gfg package
author string
}
3.遗产
当一个类获得其超类的属性时,我们可以说它是继承。这里,子类/子类是用于获取属性的类的术语。对于这个,我们必须使用一个结构来实现 Golang 中的继承。在这里,用户必须使用结构来组成其他对象。
4.接口
接口是具有多种方法的类型。实现接口的所有方法的对象自动实现接口,即隐式满足接口。通过以一致的方式处理不同类型的对象,只要它们坚持一个接口,Golang 就实现了多态性。
示例:
// Golang program to illustrate the
// concept of interfaces
package main
import (
"fmt"
)
// defining an interface
type Sport interface{
// name of sport method
sportName() string
}
// declaring a struct
type Human struct{
// defining struct variables
name string
sport string
}
// function to print book details
func (h Human) sportName() string{
// returning a string value
return h.name + " plays " + h.sport + "."
}
// main function
func main() {
// declaring a struct instance
human1 := Human{"Rahul", "chess"}
// printing details of human1
fmt.Println(human1.sportName())
// declaring another struct instance
human2 := Human{"Riya", "carrom"}
// printing details of human2
fmt.Println(human2.sportName())
}
输出:
Rahul plays chess.
Riya plays carrom.