自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go語(yǔ)言中的面向?qū)ο缶幊?OOP)

開發(fā) 前端
數(shù)據(jù)抽象是一種設(shè)計(jì)模式,其中數(shù)據(jù)僅對(duì)語(yǔ)義相關(guān)的函數(shù)可見(jiàn),以防止誤用。數(shù)據(jù)抽象的成功導(dǎo)致在面向?qū)ο蠛图兒瘮?shù)式編程中頻繁地將數(shù)據(jù)隱藏作為設(shè)計(jì)原則。

在Go語(yǔ)言中,雖然沒(méi)有像面向?qū)ο笳Z(yǔ)言那樣的類,但通過(guò)結(jié)構(gòu)體類型和方法,仍然支持部分面向?qū)ο缶幊蹋∣OP)的概念。

封裝(Encapsulation)

封裝是一種將一個(gè)對(duì)象的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),使其對(duì)其他對(duì)象不可見(jiàn)的做法,這樣可以實(shí)現(xiàn)解耦。

例如,考慮以下結(jié)構(gòu)體:

type Student struct{
  name string
  rollNo uint64
}

其中的name和rollNo字段是私有的,因?yàn)樗鼈円孕懽帜搁_頭。為了提供公共訪問(wèn),可以為這些字段定義對(duì)應(yīng)的getter和setter方法。

func (s *Student) GetName() string {
  return s.name
}

func (s *Student) SetName(name string) {
  s.name = name
}

func (s *Student) GetRollNo() uint64 {
  return s.rollNo
}

func (s *Student) SetRollNo(roll uint64) {
  s.rollNo = roll
}

現(xiàn)在,程序的其他部分也可以創(chuàng)建Student結(jié)構(gòu)體的對(duì)象,并通過(guò)公共的getter和setter方法訪問(wèn)name和rollNo,從而實(shí)現(xiàn)了封裝。

抽象(Abstraction)

數(shù)據(jù)抽象是一種設(shè)計(jì)模式,其中數(shù)據(jù)僅對(duì)語(yǔ)義相關(guān)的函數(shù)可見(jiàn),以防止誤用。數(shù)據(jù)抽象的成功導(dǎo)致在面向?qū)ο蠛图兒瘮?shù)式編程中頻繁地將數(shù)據(jù)隱藏作為設(shè)計(jì)原則。

在Go語(yǔ)言中,可以通過(guò)接口實(shí)現(xiàn)抽象。接口定義了一組必須實(shí)現(xiàn)的方法,以滿足接口的要求。

例如,考慮以下接口:

type iStudent interface{
  calcPercentage() float64
}

該接口定義了一個(gè)名為calcPercentage()的方法,用于計(jì)算學(xué)生的百分比。

繼承(Inheritance)

在Go語(yǔ)言中,不支持傳統(tǒng)意義上的繼承。相反,Go使用組合來(lái)實(shí)現(xiàn)類似的功能。一個(gè)結(jié)構(gòu)體可以嵌入另一個(gè)結(jié)構(gòu)體,從而繼承其字段和方法。

例如,考慮以下結(jié)構(gòu)體:

type Person struct {
 name string
 age  uint64
}

type Student struct {
 Person
 studentID uint64
}

在這里,Student結(jié)構(gòu)體嵌入了Person結(jié)構(gòu)體,這意味著它繼承了Person的name字段。Student結(jié)構(gòu)體還有自己的studentID字段?,F(xiàn)在,任何對(duì)Person操作的方法也可以對(duì)Student操作,因?yàn)镾tudent是一個(gè)帶有額外字段的Person。

多態(tài)(Polymorphism)

多態(tài)是指調(diào)用代碼可以獨(dú)立于所支持層次結(jié)構(gòu)中的類(父類或其子類)而運(yùn)行的情況。

在Go語(yǔ)言中,可以通過(guò)使用接口來(lái)實(shí)現(xiàn)多態(tài)。由于Go是一種靜態(tài)類型的語(yǔ)言,變量的類型必須在編譯時(shí)已知。然而,通過(guò)使用接口,可以編寫可以在滿足相同接口要求的不同類型上操作的代碼,而無(wú)需在編譯時(shí)知道其具體類型。

例如,考慮以下代碼:

func PrintStudentDetails(s *Student) {
  fmt.Println("Student Name:", s.GetName())
  fmt.Println("Student Age:", s.GetAge())
  fmt.Println("Percentage",s.CalcPercentage())
}

現(xiàn)在,我們可以將任何實(shí)現(xiàn)了PrintStudentDetails()方法的類型作為參數(shù)調(diào)用該函數(shù),比如Student類型,它會(huì)顯示該學(xué)生的詳細(xì)信息。這就是多態(tài)的實(shí)現(xiàn)。

完整的面向?qū)ο缶幊淘贕o中的示例:

package main

import "fmt"

type Shape interface {
 Area() float64
}

type Triangle struct {
 Base, Height float64
}

func (t Triangle) Area() float64 {
 return 0.5 * t.Base * t.Height
}

type Square struct {
 Side float64
}

func (s Square) Area() float64 {
 return s.Side * s.Side
}

type Rectangle struct {
 Length, Breadth float64
}

func (r Rectangle) Area() float64 {
 return r.Length * r.Breadth
}

func printArea(s Shape) {
 fmt.Println("Area of shape is : ", s.Area())
}

func main() {
 t := Triangle{Base: 10, Height: 20}
 printArea(t)    //Area of shape is :  100

 s := Square{Side: 20}
 printArea(s)    //Area of shape is :  400

 r := Rectangle{Length: 20, Breadth: 10}
 printArea(r)    //Area of shape is :  200
}
責(zé)任編輯:武曉燕 來(lái)源: 愛(ài)發(fā)白日夢(mèng)的后端
相關(guān)推薦

2024-04-02 07:32:58

Go語(yǔ)言接口

2020-07-24 09:40:04

C語(yǔ)言OOP代碼

2010-08-24 16:00:43

C語(yǔ)言

2011-04-02 09:07:46

OOP

2024-03-26 11:54:35

編程抽象代碼

2025-04-02 03:11:00

Python函數(shù)C++

2021-05-28 05:34:06

Golang語(yǔ)言編程

2023-02-16 09:55:24

對(duì)象編程OOP

2013-03-11 09:23:22

Go語(yǔ)言面向?qū)ο?/a>

2023-12-21 07:09:32

Go語(yǔ)言任務(wù)

2021-07-15 23:18:48

Go語(yǔ)言并發(fā)

2024-04-07 11:33:02

Go逃逸分析

2022-07-19 12:25:29

Go

2023-07-29 15:03:29

2023-11-30 08:09:02

Go語(yǔ)言

2021-06-08 07:45:44

Go語(yǔ)言優(yōu)化

2021-11-08 07:48:48

Go語(yǔ)言對(duì)象

2022-09-29 10:01:05

Go編程語(yǔ)言文本文件

2023-01-12 08:52:50

GoroutinesGo語(yǔ)言

2017-04-21 09:07:39

JavaScript對(duì)象編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)