亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言-為什么返回值為接口類型,卻返回結(jié)構(gòu)體

 更新時間:2021年04月24日 15:41:44   作者:風(fēng)情小皮球  
這篇文章主要介紹了Go語言返回值為接口類型,卻返回結(jié)構(gòu)體的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

最近由于項目需求,閱讀一些Go語言編寫的項目的源代碼,在某一個函數(shù)中發(fā)現(xiàn)了一個奇怪的現(xiàn)象:一個函數(shù)的返回值類型聲明的是一個接口的類型,但是實際在函數(shù)體內(nèi)返回的卻是一個結(jié)構(gòu)體類型的對象。

這個現(xiàn)象對于新手的我來說很是費解。在經(jīng)過一些資料的查閱之后,自己得到了如下的解釋:

一個結(jié)構(gòu)體實現(xiàn)了一個接口,那么函數(shù)中返回值類型為接口時,就應(yīng)該返回這個結(jié)構(gòu)體。

下面舉一個例子來說明:

package main
import (
	"fmt"
)
/**
Shape接口定義兩個函數(shù):
area() :計算面積
circumference() :計算周長
*/
type Shape interface {
	area() float64
	circumference() float64
}
//結(jié)構(gòu)體正方形,屬性邊長
type square struct {
	length float64
}
//方法area,由正方形結(jié)構(gòu)體實現(xiàn)
func (s square) area()  float64 {
	sarea := s.length * s.length
	return sarea
}
//方法circumference,由正方形結(jié)構(gòu)體實現(xiàn)
func (s square) circumference()  float64 {
	scircumference := s.length * 4
	return scircumference
}
func getarea(len float64) Shape {
	s := square{
		length:4,
	}
	fmt.Println("正方形的面積為:",s.area())
	fmt.Println("正方形的周長為:",s.circumference())
	return s
}
func main() {
	getarea(4)
}

或者另一個版本:

package main
import (
	"fmt"
)
/**
Shape接口定義兩個函數(shù):
area() :計算面積
circumference() :計算周長
*/
type Shape interface {
	area() float64
	circumference() float64
}
//結(jié)構(gòu)體正方形,屬性邊長
type square struct {
	length float64
}
//方法area,由正方形結(jié)構(gòu)體實現(xiàn)
func (s *square) area()  float64 {
	sarea := s.length * s.length
	return sarea
}
//方法circumference,由正方形結(jié)構(gòu)體實現(xiàn)
func (s *square) circumference()  float64 {
	scircumference := s.length * 4
	return scircumference
}
func getarea(len float64) Shape {
	s := &square{
		length:4,
	}
	fmt.Println("正方形的面積為:",s.area())
	fmt.Println("正方形的周長為:",s.circumference())
	return s
}
func main() {
	getarea(4)
}

這兩個代碼的區(qū)別就是前者使用了值傳遞,后者使用了指針傳遞。由于這里沒有改變結(jié)構(gòu)體中的屬性值,所以兩種方法在這樣的應(yīng)用場景下,沒有什么區(qū)別,下面來解釋一下這些簡單的demo:

首先我定義了一個Shape接口,里面有兩個待實現(xiàn)的方法area() :計算面積 和 circumference() :計算周長

然后定義了一個正方形結(jié)構(gòu)體,里面只有一個邊長屬性。

然后使用正方形結(jié)構(gòu)體實現(xiàn)這個Shape接口

接著我們就可以進入正題,試驗我們標(biāo)題的問題了,使用Shape接口類型作為返回值,但是在函數(shù)體內(nèi)實際的返回值是正方形結(jié)構(gòu)體。

這是Go的一種語法,但實際的作用或者為是什么這樣寫,我還沒有弄清楚,但是通過以上這個實實在在的例子,關(guān)于為什么返回值類型和實際返回的不一樣有了一定的理解。

補充:Go語言-結(jié)構(gòu)體和接口

結(jié)構(gòu)體和接口

接口嵌套

接口中允許嵌套其他接口,效果等同于復(fù)制被嵌套的接口中的方法

當(dāng)前的接口中不允許有與嵌入的接口相同的方法

方法相同的接口相等同

接口不能為空,否則等同于空接口

結(jié)構(gòu)體嵌套

結(jié)構(gòu)體中的匿名成員內(nèi)的成員和方法會被嵌套到當(dāng)前結(jié)構(gòu)體中

當(dāng)前結(jié)構(gòu)體中允許有與被嵌套結(jié)構(gòu)體相同的成員和方法,且會覆蓋被嵌套的結(jié)構(gòu)體的成員和方法

兩個被嵌套的結(jié)構(gòu)體有相同的成員或方法,會發(fā)生沖突

有時候編輯器不會提示,但會產(chǎn)生運行時錯誤

成員名稱和類型完全相同的結(jié)構(gòu)體

如果其中一個是匿名的,可以直接賦值或判斷相等

類型名不同可以進行類型轉(zhuǎn)換,不可以直接賦值或判斷相等

方法的接收器只能是在當(dāng)前包中指定名稱的類型,不能是原生類型、復(fù)合類型、其他包中的類型

重新命名的結(jié)構(gòu)體與原結(jié)構(gòu)體成員完全相同(包括tag),但是沒有原來的方法

接口實現(xiàn)

一個類型實現(xiàn)了接口的所有方法,就是實現(xiàn)了接口,不管類型和接口之間是否有關(guān)聯(lián)

方法的接收器可以是這個類型或者這個類型的指針類型

指針類型的接收器可以被修改成員

非指針類型的實例直接調(diào)用指針類型接收器的方法,會遇到無法調(diào)用指針方法,無法獲取地址的問題

指針類型的實例調(diào)用非指針類型接收器的方法不會出現(xiàn)問題

將實例賦值給變量再調(diào)用不會出現(xiàn)問題

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • golang抓取網(wǎng)頁并分析頁面包含的鏈接方法

    golang抓取網(wǎng)頁并分析頁面包含的鏈接方法

    今天小編就為大家分享一篇golang抓取網(wǎng)頁并分析頁面包含的鏈接方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Go高級特性探究之HTTP錯誤處理詳解

    Go高級特性探究之HTTP錯誤處理詳解

    在Web應(yīng)用程序中,HTTP錯誤處理是非常重要的,它關(guān)系到Web應(yīng)用程序的穩(wěn)定性和可靠性,本文介紹如何在Go項目中處理HTTP錯誤,并提供相應(yīng)的解決方案和實踐經(jīng)驗,希望對Go語言Web應(yīng)用程序的開發(fā)者有所幫助
    2023-06-06
  • GO語言匿名函數(shù)的幾種使用方式

    GO語言匿名函數(shù)的幾種使用方式

    本文主要介紹了GO語言匿名函數(shù)的幾種使用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • Golang匯編之控制流深入分析講解

    Golang匯編之控制流深入分析講解

    這篇文章主要介紹了Golang匯編之控制流,程序執(zhí)行的流程主要有順序、分支和循環(huán)幾種執(zhí)行流程,本節(jié)主要討論如何將Go語言的控制流比較直觀地轉(zhuǎn)譯為匯編程序,或者說如何以匯編思維來編寫Go語言代碼,感興趣的同學(xué)可以參考下文
    2023-05-05
  • Go實現(xiàn)并發(fā)的示例代碼

    Go實現(xiàn)并發(fā)的示例代碼

    Go語言的并發(fā)機制是其強大和流行的一個關(guān)鍵特性之一,本文主要介紹了Go實現(xiàn)并發(fā)的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn)

    go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn)

    本文主要介紹了go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go使用Protocol?Buffers在數(shù)據(jù)序列化的優(yōu)勢示例詳解

    Go使用Protocol?Buffers在數(shù)據(jù)序列化的優(yōu)勢示例詳解

    這篇文章主要為大家介紹了Go使用Protocol?Buffers在數(shù)據(jù)序列化的優(yōu)勢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • go中的unsafe包及使用詳解

    go中的unsafe包及使用詳解

    Unsafe code是一種繞過go類型安全和內(nèi)存安全檢查的Go代碼。這篇文章主要介紹了go中的unsafe包,需要的朋友可以參考下
    2019-07-07
  • 詳解Golang?ProtoBuf的基本語法總結(jié)

    詳解Golang?ProtoBuf的基本語法總結(jié)

    最近項目是采用微服務(wù)架構(gòu)開發(fā)的,各服務(wù)之間通過gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會對Protobuf的語法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-10-10
  • 一文詳解Go語言單元測試的原理與使用

    一文詳解Go語言單元測試的原理與使用

    Go語言中自帶有一個輕量級的測試框架testing和自帶的go?test命令來實現(xiàn)單元測試和性能測試。本文將通過示例詳細(xì)聊聊Go語言單元測試的原理與使用,需要的可以參考一下
    2022-09-09

最新評論