我正在嘗試更改在Go的src文件夾中找到的Sync包的源代碼。更具體地說,我需要更改waitgroup.go文件以導出state()函數。下面是源函數:func (wg *WaitGroup) state() (statep *uint64, semap *uint32) { if uintptr(unsafe.Pointer(&wg.state1))%8 == 0 { return (*uint64)(unsafe.Pointer(&wg.state1)), &wg.state1[2] } else { return (*uint64)(unsafe.Pointer(&wg.state1[1])), &wg.state1[0] }}我需要做的就是捕獲此函數的名稱,以便我可以在代碼中使用它(我只需要檢查 waitgoup 計數器是否大于 0)。我正在使用Go Modules,到目前為止,我發現的唯一解決方案是手動更改src文件夾中的waitgroup.go文件。這并不理想,因為更改不會簽入到版本控制中。我還嘗試在我的代碼庫中重新創建waitgroup.go文件,但這會導致錯誤,因為該文件導入了Go的內部文件夾中的包。我如何更改此Go src包的代碼,同時使用版本控制(github)跟蹤更改?編輯對于某些上下文,我正在為加密貨幣設計一個點對點網絡。下面的代碼是我的對等發現系統的一部分。從本質上講,當第一次加入網絡時,節點將通過tcp向DNS服務器發出請求,并隨機選擇一個節點。然后,它向節點(創世紀節點)發出請求,請求其本地節點集。完成此請求后,即當創世節點響應時,程序將進入第二個發現周期。我正在使用等待組等待第一個周期完成。下面是將添加等待組的函數:func HandleGenesisNode(request []byte) {var buff bytes.Buffervar payload RecieveGenesisNodebuff.Write(request[commandLength:])dec := gob.NewDecoder(&buff)err := dec.Decode(&payload)Handle(err)//Initialize set with newly discovered nodeInitSet(payload.GenesisNode)//peer discovery first cyclediscoveryCycleOneWg.Add(1)GetNodeSet(payload.GenesisNode)//peer discovery second cycle once first has finisheddiscoveryCycleOneWg.Wait()//Request the set of every node in the newly generated setlocalSet := LocalSetToBytes()for i := range localSet { node := string(localSet[i]) GetNodeSet(node)}}下面是刪除等待組以指示第一個周期已完成的函數:func HandleLocalSet(request []byte) {var buff bytes.Buffervar payload LocalSetbuff.Write(request[commandLength:])dec := gob.NewDecoder(&buff)err := dec.Decode(&payload)Handle(err)fmt.Println("Comparing sets...")state, newNodes := CompareSet(payload.Set)if state == true { UpdateSet(newNodes)} else { fmt.Println("No new nodes discovered")}//allow second cycle to start if this is a response to discovery//Check the waitgroup counter before decrementing it_, wgState := discoveryCycleOneWg.State()counter := uint32(wgState)if counter > 0 { discoveryCycleOneWg.Done()}}
1 回答

蠱毒傳說
TA貢獻1895條經驗 獲得超3個贊
試試下面這樣:
package main
import (
"fmt"
"sync"
"sync/atomic"
_ "unsafe"
)
//go:linkname state sync.(*WaitGroup).state
func state(wg *sync.WaitGroup) (*uint64, *uint32)
func main() {
wg := sync.WaitGroup{}
wg.Add(2)
statep, _ := state(&wg)
stateWg := atomic.LoadUint64(statep)
v := int32(stateWg >> 32)
fmt.Printf("%d", v)
}
- 1 回答
- 0 關注
- 236 瀏覽
添加回答
舉報
0/150
提交
取消