猿问

如何解决“在没有选择器错误的情况下使用包”

我正在使用一个包:ccs08 在我的主目录中,我正在导入包并使用它的一些功能。我遵循了给出的单元测试中的用法:


package main


import(

 "fmt"

 "math/big"

 "crypto/rand"

 "zkrp/ccs08"

 "zkrp/crypto/bn256"

)


func main(){


        var (

            r *big.Int

            s []int64

        )

        s = make([]int64, 4)

        s[0] = 12

        s[1] = 42

        s[2] = 61

        s[3] = 71

        p, _ := ccs08.SetupSet(s)

        r, _ = rand.Int(rand.Reader, bn256.Order)

        proof_out, _ := ccs08.ProveSet(12, r, p)

        result, _ := ccs08.VerifySet(&proof_out, &p)

        if result != true {

            fmt.Println("not verified")

        }

}

然后我有一个类似的主文件 main2,我在其中使用来自同一个包的另一组函数。这不起作用


package main


import(

 "fmt"

 "math/big"

 "crypto/rand"

 "zkrp/ccs08"

 "zkrp/crypto/bn256"

)


func main(){


    var (


        result bool

        zkrp ccs08

    )

    zkrp.Setup(347184000, 599644800)

    zkrp.x = new(big.Int).SetInt64(419835123)

    zkrp.r, _ = rand.Int(rand.Reader, bn256.Order)

    e := zkrp.Prove()

    result, _ = zkrp.Verify()

    if result != true {

        fmt.println("not verified")

    }


}

我收到此错误:

./main2.go:7: 已导入且未使用:“zkrp/ccs08”。


./main2.go:16:使用没有选择器的包 ccs08。


我究竟做错了什么?


白衣染霜花
浏览 174回答 1
1回答

守着一只汪

ccs08对于第一个文件,一切正常,因为代码使用了包的公共成员。但是,第二个文件并非如此。您提到第二个文件中的代码是从这里复制的。要了解为什么代码在粘贴到包外的 main 方法时不起作用ccs08,您需要了解它在其原始位置所做的事情。具体这部分:var (    result bool    zkrp   ccs08)在原始位置(ccs08包内)有一个名为ccs08. 声明可以在这里看到。上面的代码正在做的是创建一个名为zkrp的变量,其类型是私有结构类型ccs08。然后,在变量上调用的各种函数是绑定到这个私有结构的方法(您可以在此处查看方法)。现在,在您发布的代码中(粘贴到ccs08包外的位置后),无法访问私有ccs08结构(我什至找不到在 zkrp 源代码中返回它的公共方法)。因此,Go 在尝试执行此代码时看到的是一个错字(它认为您正在尝试编写某种形式的东西package.Member):// this looks like you wanted to declare a variable with type:// "ccs08.SomeType" but forgot to write ".SomeType"// Thus Go gives the error: "use of package ccs08 without selector"var zkrp ccs08 并且“已导入且未使用”错误是因为该ccs08包未在代码中的任何位置以有效方式使用。老实说,您复制的代码对于所有字符串的重用ccs08和zkrp不同事物的命名非常令人困惑。我希望这能澄清一点。
随时随地看视频慕课网APP

相关分类

Go
我要回答