最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言學(xué)習(xí)之接口使用的示例詳解

 更新時(shí)間:2022年11月24日 09:05:42   作者:孫琦Ray  
Go語言并沒有類的定義,接口可以說Go語言最接近于類的實(shí)現(xiàn)方式,但是更輕量。本文將通過一些簡(jiǎn)單的示例和大家介紹下Go語言中接口的使用,感興趣的可以學(xué)習(xí)一下

正如前文提到,Go語言并沒有類的定義,接口可以說Go語言最接近于類的實(shí)現(xiàn)方式,但是更輕量。對(duì)于接口的學(xué)習(xí),如果從原理層面理解學(xué)習(xí)起來比較慢,所以建議先從代碼使用維度進(jìn)行理解,最終回歸到原理層面加深理解。

需求與分析

假設(shè)我們有一組圖形,需要計(jì)算每個(gè)圖形的面積,并計(jì)算他們的面積之和。那么最簡(jiǎn)單的方法就是分別計(jì)算他們的面積,并進(jìn)行相加,我們來嘗試實(shí)現(xiàn)一下。

不使用接口的實(shí)現(xiàn)

在這個(gè)代碼實(shí)現(xiàn)中,我們需要將兩種不同形狀,矩形(rect)和圓形(circle)的面積求和,因此我們定義了如下內(nèi)容:

  • 兩個(gè)結(jié)構(gòu)體,矩形是長(zhǎng)和寬,圓形是半徑
  • 分別實(shí)現(xiàn)了兩個(gè)求面積的方法area(),矩形的面積等于長(zhǎng)乘以寬,而圓形面積則是半徑的平方乘以Pi
  • 在求和部分,我們直接定義了一個(gè)float64的數(shù)組,將面積直接存入該數(shù)組中
  • 通過循環(huán)進(jìn)行求和

雖然上述方式能夠滿足我們的需求,但是如果我們需要增加一個(gè)計(jì)算周長(zhǎng)的方法時(shí),我們的代碼會(huì)變得非常冗余并且可讀性變差,因此我們用接口嘗試來改造我們的代碼。

package main

import (
    "fmt"
    "math"
)

type rect struct {
    width float64
    height float64
}

func (r rect) area() float64 {
    return r.width * r.height
}

type circle struct {
    radius float64
}

func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

func main() {
    var areaSum float64
    
    // Intial circle and rect struct type
    c1 := circle{2.5}
    r1 := rect{3, 4}
    
    // Save all area results into an array
    shapeAreas := []float64{c1.area(), r1.area()}
    
    // Sum all area together
    areaSum = 0
    for _, area := range shapeAreas {
        areaSum += area
    }
    
    fmt.Printf("Sum area = %v\n", areaSum)
}

使用接口的實(shí)現(xiàn)

相較于上述代碼,我們做了如下優(yōu)化:

  • 定義了一個(gè)新的interface shape,包含一個(gè)area()方法,即實(shí)現(xiàn)了area()的struct,就實(shí)現(xiàn)了shape接口
  • 在結(jié)構(gòu)體定義,area()計(jì)算部分我們并沒有修改
  • 在主函數(shù)中,我們重新定義了一個(gè)類型為shape interface的數(shù)組,該數(shù)組中無須再計(jì)算area(),只需要將兩個(gè)不通類型存放在該數(shù)組中
  • 在循環(huán)過程中,我們直接調(diào)用每個(gè)shape interface中的area()方法,即可完成面積求和
package main

import (
    "fmt"
    "math"
)

// Define a new interface, contain a method define and type is float64
type shape interface {
    area() float64
}

type rect struct {
    width float64
    height float64
}

func (r rect) area() float64 {
    return r.width * r.height
}

type circle struct {
    radius float64
}

func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

func main() {
    var areaSum float64
    
    // Intial circle and rect struct type
    c1 := circle{2.5}
    r1 := rect{3, 4}
    
    // Previous: Save all area results into an array
    // Previous: shapeAreas := []float64{c1.area(), r1.area()}
    
    // Define an array with new shape interface
    shapes := []shape{c1, r1}
    
    // Previous: Sum all area together
    areaSum = 0
    // Previous: for _, area := range shapeAreas {
    // Previous:     areaSum += area
    // Previous: }
    
    // Implement a new loop
    for _, shape := range shapes {
        areaSum += shape.area()
    }
    
    fmt.Printf("Sum area = %v\n", areaSum)
}

接口作為函數(shù)參數(shù)

進(jìn)一步優(yōu)化代碼,我們將接口作為參數(shù),在主函數(shù)中調(diào)用時(shí),只需要傳入相應(yīng)類型就會(huì)自動(dòng)根據(jù)類型調(diào)用相應(yīng)的計(jì)算面積的方法。

package main

import (
    "fmt"
    "math"
)

// Define a new interface, contain a method define and type is float64
type shape interface {
    area() float64
}

type rect struct {
    width float64
    height float64
}

// NOTE: 接口類型為rect
func (r rect) area() float64 {
    return r.width * r.height
}

type circle struct {
    radius float64
}

// NOTE: 接口類型為circle
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

func getArea(s shape) float64 {
    return s.area()
}

func main() {
    var areaSum float64

    // Intial circle and rect struct type
    c1 := circle{2.5}
    r1 := rect{3, 4}

    // Previous: Save all area results into an array
    // Previous: shapeAreas := []float64{c1.area(), r1.area()}

    // Define an array with new shape interface
    shapes := []shape{c1, r1}

    // Previous: Sum all area together
    areaSum = 0
    // Previous: for _, area := range shapeAreas {
    // Previous:     areaSum += area
    // Previous: }

    // Implement a new loop
    for _, shape := range shapes {
        areaSum += getArea(shape)
    }

    fmt.Printf("Sum area = %v\n", areaSum)
}

到此這篇關(guān)于Go語言學(xué)習(xí)之接口使用的示例詳解的文章就介紹到這了,更多相關(guān)Go語言接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang 1.16 中 Modules的主要變化更新

    Golang 1.16 中 Modules的主要變化更新

    這篇文章主要介紹了Golang 1.16 中 Modules的主要變化更新,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Go語言基于HTTP的內(nèi)存緩存服務(wù)的實(shí)現(xiàn)

    Go語言基于HTTP的內(nèi)存緩存服務(wù)的實(shí)現(xiàn)

    這篇文章主要介紹了Go語言基于HTTP的內(nèi)存緩存服務(wù),本程序采用REST接口,支持設(shè)置(Set)、獲取(Get)和刪除(Del)這3個(gè)基本操作,同時(shí)還支持對(duì)緩存服務(wù)狀態(tài)進(jìn)行查詢,需要的朋友可以參考下
    2022-08-08
  • goland配置自動(dòng)注釋的實(shí)現(xiàn)

    goland配置自動(dòng)注釋的實(shí)現(xiàn)

    本文主要介紹了goland配置自動(dòng)注釋的實(shí)現(xiàn),文中通過圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Go語言設(shè)計(jì)模式之結(jié)構(gòu)型模式

    Go語言設(shè)計(jì)模式之結(jié)構(gòu)型模式

    本文主要聚焦在結(jié)構(gòu)型模式(Structural Pattern)上,其主要思想是將多個(gè)對(duì)象組裝成較大的結(jié)構(gòu),并同時(shí)保持結(jié)構(gòu)的靈活和高效,從程序的結(jié)構(gòu)上解決模塊之間的耦合問題
    2021-06-06
  • 基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn)

    基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn)

    這篇文章主要介紹了基于golang的簡(jiǎn)單分布式延時(shí)隊(duì)列服務(wù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體

    Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體

    這篇文章主要介紹了Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體,結(jié)構(gòu)體是包含多個(gè)字段的集合類型,用于將數(shù)據(jù)組合為記錄
    2022-07-07
  • 一文帶你徹底搞懂 Golang 中的方法(Methods)

    一文帶你徹底搞懂 Golang 中的方法(Methods)

    Golang 支持一些類似面向?qū)ο缶幊痰奶匦裕椒ň推渲兄?,本文將詳?xì)介紹 Golang 中方法相關(guān)的知識(shí),感興趣的小伙伴跟著小編一起來學(xué)習(xí)吧
    2023-07-07
  • gorm update傳入struct對(duì)象,零值字段不更新的解決方案

    gorm update傳入struct對(duì)象,零值字段不更新的解決方案

    這篇文章主要介紹了gorm update傳入struct對(duì)象,零值字段不更新的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go?復(fù)合類型之字典類型使用教程示例

    Go?復(fù)合類型之字典類型使用教程示例

    這篇文章主要為大家介紹了Go復(fù)合類型之字典類型使用教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 關(guān)于golang中死鎖的思考與學(xué)習(xí)

    關(guān)于golang中死鎖的思考與學(xué)習(xí)

    本文主要介紹了關(guān)于golang中死鎖的思考與學(xué)習(xí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

墨脱县| 怀宁县| 双鸭山市| 邹平县| 鸡东县| 翁源县| 策勒县| 东乌珠穆沁旗| 类乌齐县| 库车县| 兴安盟| 长乐市| 广东省| 兴宁市| 牙克石市| 舞钢市| 北海市| 定结县| 科技| 滨海县| 泰州市| 朔州市| 张北县| 大城县| 吉木萨尔县| 望江县| 枣强县| 石泉县| 揭阳市| 望城县| 宣化县| 渝中区| 南通市| 伊春市| 彭阳县| 阿坝| 岚皋县| 庆安县| 荃湾区| 宜昌市| 屯留县|