Go語言 返回值為介面型別,卻返回結構體

2021-10-04 16:03:20 字數 1599 閱讀 8990

最近由於專案需求,閱讀一些go語言編寫的專案的源**,在某乙個函式中發現了乙個奇怪的現象:乙個函式的返回值型別宣告的是乙個介面的型別,但是實際在函式體內返回的卻是乙個結構體型別的物件。這個現象對於新手的我來說很是費解。在經過一些資料的查閱之後,自己得到了如下的解釋:

乙個結構體實現了乙個介面,那麼函式中返回值型別為介面時,就應該返回這個結構體。

下面舉乙個例子來說明:

package main

import

("fmt"

)/**

shape介面定義兩個函式:

area(

) :計算面積

circumference(

) :計算周長

*/type shape inte***ce

//結構體正方形,屬性邊長

type square struct

//方法area,由正方形結構體實現

func (s square) area(

) float64

//方法circumference,由正方形結構體實現

func (s square) circumference(

) float64

func getarea(len float64) shape

fmt.println(

"正方形的面積為:",s.area(

)) fmt.println(

"正方形的周長為:",s.circumference(

))return s

}func main(

)

或者另乙個版本:

package main

import

("fmt"

)/**

shape介面定義兩個函式:

area(

) :計算面積

circumference(

) :計算周長

*/type shape inte***ce

//結構體正方形,屬性邊長

type square struct

//方法area,由正方形結構體實現

func (s *square) area(

) float64

//方法circumference,由正方形結構體實現

func (s *square) circumference(

) float64

func getarea(len float64) shape

fmt.println(

"正方形的面積為:",s.area(

)) fmt.println(

"正方形的周長為:",s.circumference(

))return s

}func main(

)

這兩個**的區別就是前者使用了值傳遞,後者使用了指標傳遞。由於這裡沒有改變結構體中的屬性值,所以兩種方法在這樣的應用場景下,沒有什麼區別,下面來解釋一下這些簡單的demo:

這是go的一種語法,但實際的作用或者為是什麼這樣寫,我還沒有弄清楚,但是通過以上這個實實在在的例子,關於為什麼返回值型別和實際返回的不一樣有了一定的理解。

函式返回值為指標型別

char getstring void void main void 在函式getstring 中定義的變數p屬於local 區域性變數 當函式結束時自動消失,所以在返回時,根本就得不到p所指的內容。解決辦法有以下幾種 可能還有很多方法,不過這裡只是最常見的幾中,也是最能體表現程式中記憶體使用的情況...

C語言函式返回值為指標和函式返回值為void

有時遇到函式返回值為空和函式返回值為指標的情況下,需要在前面定義該函式 函式的返回值為指標也必須在此定義,函式的返回值為void必須在此定義,返回值是整形或者其他基本型別不需要在此定義 函式功能 把格式化的資料寫入某個字串 函式原型 int sprintf char buffer,const cha...

spring mvc返回值型別

spring mvc處理方法支援如下的返回方式 modelandview,model,modelmap,map,view,string,void。下面一一進行說明 返回的邏輯檢視名是 demo message 通過modelandview構造方法可以指定返回的頁面名稱,也可以通過setviewnam...