以下做法是錯(cuò)誤的盖灸,因?yàn)檫@個(gè)地址會(huì)隨著時(shí)間推移而變得不可用蚁鳖,因此合理的安排項(xiàng)目目錄是更為合理的解決方案!A扪住W砘!
項(xiàng)目中碰到了一些問題徙垫,使用了指針函數(shù)的思路來解決相應(yīng)問題
在實(shí)際項(xiàng)目中讥裤,因?yàn)閮蓚€(gè)項(xiàng)目互相引了對(duì)方的一些方法,導(dǎo)致了循環(huán)引用的錯(cuò)誤姻报,原本可以使用http的請(qǐng)求來解決己英,經(jīng)過其他人指導(dǎo),發(fā)現(xiàn)了可以使用指針函數(shù)來解決
這里通過一個(gè)簡單的例子來說明吴旋,首先是例子的結(jié)構(gòu)损肛,我們僅僅用到了這兩個(gè)文件:ciconnector.go和rockettest.go
原本設(shè)定的方法是這兩個(gè)包里的函數(shù)互相調(diào)用厢破,那么我們通過代碼來看下怎么解決相應(yīng)的問題。
首先是rockettest.go治拿,這里調(diào)用了ciconnector.go中的Test方法摩泪,代碼如下
package main
import (
"fmt"
"citest"
)
func main() {
str := "hello world"
citest.Test(str, rocketfunction)
}
func rocketfunction(str string) {
fmt.Println(str)
}
這里我們將函數(shù)名稱作為參數(shù)傳遞給ciconnector.go的Test函數(shù)中
接下來我們看下ciconnector.go的代碼
package citest
import (
"fmt"
"reflect"
"strconv"
"unsafe"
)
type Callback func(str string)
func Test(str string, callback Callback) {
//pointer 轉(zhuǎn) string
straddress := &callback
strPiniter := fmt.Sprintf("%d", unsafe.Pointer(straddress))
fmt.Println("connection is", strPiniter)
//string 轉(zhuǎn) pointer
intPointer, _ := strconv.ParseInt(strPiniter, 10, 0)
var pointer *Callback
pointer = *(**Callback)(unsafe.Pointer(&intPointer))
(Callback)(*pointer)(str)
}
在ciconnector.go中,我們定義了一個(gè)Callback類型的函數(shù)忍啤,這個(gè)函數(shù)和rockettest.go中傳入的函數(shù)類型相同加勤,可以理解為一個(gè)接口
之后變量straddress則是傳入函數(shù)的地址,我們將地址通過fmt.Sprintf的形式轉(zhuǎn)為了十進(jìn)制的數(shù)的string類型同波,并賦值給strPiniter
至于string轉(zhuǎn)換回指針鳄梅,則是通過strconvs將string轉(zhuǎn)為了十進(jìn)制的數(shù)字,pointer是一個(gè)指向Callback類型的指針未檩,給它賦值的時(shí)候是先把intpointer轉(zhuǎn)化為unsafe的指針類型戴尸,然后將其轉(zhuǎn)換為指向Callback指針的指針,并將其指向的內(nèi)容賦值給pointer冤狡,最后將pointer指向的內(nèi)容轉(zhuǎn)換為Callback類型后孙蒙,即可使用,這里使用的函數(shù)是rockettest.go中的函數(shù)悲雳,但是卻沒有調(diào)用其內(nèi)容