GO語言的 類 操作

2021-07-07 07:29:30 字數 2044 閱讀 2600

當發現go語言沒有類時,小夥伴都震驚了,但是如果你要保證好的**結構與內部邏輯組織結構,類這種模式貌似又是不可或缺的

那麼問題來了,go語言有沒有辦法來模擬類操作呢?答案是肯定的

首先我們來看go語言struct資料型別

type godeye struct

初始化p := godeye  //有序  

p := godeye        //無序

最有意思的是,struct可以增加關聯函式

func funcname(varname1 typename2[,varname2 typename2, ...]) typename

例子func (this godeye) test(area string) string

其中godeye就是對應的godeye struct而this.name就是godeye中的name

有沒有發現,和類何其的相似,在乙個go檔案裡,可以定義乙個struct,name age相當於類裡的變數

test相當於類裡的方法

但是光模擬是沒有用的,我們該怎麼呼叫呢?

類呼叫很簡單,直接用classname->test()直接呼叫類對應的方法

go語言就不同,甚至可以說複雜多,首先你要先理解reflect反射的概念,其次還要熟悉inte***ce,再次還要理解new make是怎麼運作的

reflect反射:呼叫的關鍵

反射就是動態執行時的狀態。對應的包是reflect包

i在這裡是乙個struct,轉化為reflect物件

t := reflect.typeof(i)    //得到型別的元資料,通過t我們能獲取型別定義裡面的所有元素

v := reflect.valueof(i)   //得到實際的值,通過v我們獲取儲存在裡面的值,還可以去改變值

轉化為reflect物件之後我們就可以進行一些操作了,也就是將reflect物件轉化成相應的值,例如

tag := t.elem().field(0).tag        //獲取定義在struct裡面的標籤

name := v.elem().field(0).string()  //獲取儲存在第乙個字段裡面的值

inte***ce:函式的引數

簡單的說,inte***ce是一組method的組合,我們通過inte***ce來定義物件的一組行為

我們可以通過定義inte***ce引數,讓函式接受各種型別的引數

還是用乙個可執行的完整例子來說明:

1.新建乙個main.go

//建立例項

conf := action.conf{}

conf.op = &m

//值資訊

v := reflect.valueof(conf)

callmethod(&v, m, inte***ce{})

}func callmethod(v *reflect.value, method string, params inte***ce{})

//呼叫

ret := f.call(args)

if ret[0].kind() == reflect.string

} else

}2.在main.go的同一級目錄建立action資料夾,裡面加入action.go檔案

package action

type conf struct

func (this conf) test(name string) string

3.編譯執行,然後瀏覽器輸入 http://localhost:8080/index?m=test&a=b

檢視輸出結果

Go語言基礎(十六) Go語言檔案操作

package main import fmt os bufio io ioutil 錯誤處理方法 func handle why string,e error func main handle 檔案讀取失敗!err fmt.println str fmt.println 檔案讀取完畢!讀檔案方式二...

Go語言操作MySQL

go語言安裝mysql資料庫驅動步驟 安裝驅動 go get github.com go sql driver mysql檢測安裝是否成功 sudo find name go sql driver 進入mysql目錄。ls l wc l一共32個檔案 匯入mysql資料庫驅動import 測試連線資...

go語言操作kafka

go語言中連線kafka使用第三方庫 github.com shopify sarama。go get github.com shopify saramasarama v1.20之後的版本加入了zstd壓縮演算法,需要用到cgo,在windows平台編譯時會提示類似如下錯誤 所以在windows平台...