欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

下面舉一個例子來說明:

package main
import (
	"fmt"
)
/**
Shape接口定義兩個函數(shù):
area() :計(jì)算面積
circumference() :計(jì)算周長
*/
type Shape interface {
	area() float64
	circumference() float64
}
//結(jié)構(gòu)體正方形,屬性邊長
type square struct {
	length float64
}
//方法area,由正方形結(jié)構(gòu)體實(shí)現(xiàn)
func (s square) area()  float64 {
	sarea := s.length * s.length
	return sarea
}
//方法circumference,由正方形結(jié)構(gòu)體實(shí)現(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() :計(jì)算面積
circumference() :計(jì)算周長
*/
type Shape interface {
	area() float64
	circumference() float64
}
//結(jié)構(gòu)體正方形,屬性邊長
type square struct {
	length float64
}
//方法area,由正方形結(jié)構(gòu)體實(shí)現(xiàn)
func (s *square) area()  float64 {
	sarea := s.length * s.length
	return sarea
}
//方法circumference,由正方形結(jié)構(gòu)體實(shí)現(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接口,里面有兩個待實(shí)現(xiàn)的方法area() :計(jì)算面積 和 circumference() :計(jì)算周長

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

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

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

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

補(bǔ)充: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)生運(yùn)行時錯誤

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

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

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

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

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

接口實(shí)現(xiàn)

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

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

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

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

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

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

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

相關(guān)文章

  • Golang中的泛型你真的了解嗎

    Golang中的泛型你真的了解嗎

    Golang?在?1.18?版本更新后引入了泛型,這是一個重要的更新,Gopher?萬眾矚目,為?Golang?帶來了更多的靈活性和可重用性,今天,我們將深入探討泛型的概念、為什么需要泛型、泛型的語法,并探討如何在實(shí)踐中使用它
    2023-05-05
  • 淺談一下前端http與https有什么區(qū)別

    淺談一下前端http與https有什么區(qū)別

    這篇文章主要介紹了淺談一下前端http與https有什么區(qū)別,現(xiàn)今大部分的網(wǎng)站都已經(jīng)使用了 https 協(xié)議,那么https對比http協(xié)議有哪些不同呢,需要的朋友可以參考下
    2023-04-04
  • Golang 并發(fā)以及通道的使用方式

    Golang 并發(fā)以及通道的使用方式

    這篇文章主要介紹了Golang 并發(fā)以及通道的使用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Go語言映射內(nèi)部實(shí)現(xiàn)及基礎(chǔ)功能實(shí)戰(zhàn)

    Go語言映射內(nèi)部實(shí)現(xiàn)及基礎(chǔ)功能實(shí)戰(zhàn)

    這篇文章主要為大家介紹了Go語言映射的內(nèi)部實(shí)現(xiàn)和基礎(chǔ)功能實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-03-03
  • Golang 斷言與閉包使用解析

    Golang 斷言與閉包使用解析

    這篇文章主要介紹了Golang 斷言與閉包使用解析,Go中的斷言用于判斷變量的類型,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • go并發(fā)利器sync.Once使用示例詳解

    go并發(fā)利器sync.Once使用示例詳解

    這篇文章主要為大家介紹了go并發(fā)利器sync.Once使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • grpool?goroutine池協(xié)程管理

    grpool?goroutine池協(xié)程管理

    這篇文章主要介紹了grpool?goroutine池協(xié)程管理,goroutine協(xié)程非常輕量級,這也是為什么go支持高并發(fā),但是goroutine頻繁創(chuàng)建銷毀對GC的壓力比較大,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-06-06
  • Go ORM的封裝解決方式詳解

    Go ORM的封裝解決方式詳解

    這篇文章主要為大家介紹了Go ORM的封裝解決方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Go設(shè)計(jì)模式之備忘錄模式講解和代碼示例

    Go設(shè)計(jì)模式之備忘錄模式講解和代碼示例

    備忘錄是一種行為設(shè)計(jì)模式, 允許生成對象狀態(tài)的快照并在以后將其還原,本文就通過代碼示例給大家講講Go備忘錄模式,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • 聊聊Golang的語言結(jié)構(gòu)和變量問題

    聊聊Golang的語言結(jié)構(gòu)和變量問題

    這篇文章主要介紹了Golang的語言結(jié)構(gòu)和變量問題,在golang中定義變量的一般形式是使用 var 關(guān)鍵字,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11

最新評論