为了账号安全,请及时绑定邮箱和手机立即绑定

如何修改 Go 包的源代码

如何修改 Go 包的源代码

Go
富国沪深 2022-08-24 20:11:00
我正在尝试更改在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)

}


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信