面向对象编程是一种使用“对象”的思想来表示数据和方法的编程范式。 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.