我正在使用一个包: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。
我究竟做错了什么?
最佳答案
对于第一个文件,一切正常,因为代码使用了 ccs08
包的公共(public)成员。但是,第二个文件并非如此。
您提到第二个文件中的代码是从 here 复制的。
要了解为什么代码在粘贴到 ccs08
包之外的 main 方法时不起作用,您需要了解它在其原始位置所做的事情。具体这部分:
var (
result bool
zkrp ccs08
)
在原始位置(在
ccs08
包内)有一个名为 ccs08
的私有(private)结构类型。声明可见 here 。上面的代码所做的是创建一个名为 zkrp
的变量,其类型是私有(private)结构类型 ccs08
。然后,在变量上调用的各种函数是绑定(bind)到这个私有(private)结构的方法(你可以看到方法 here )。现在,在您发布的代码中(在粘贴到
ccs08
包之外的位置之后),无法访问私有(private) ccs08
结构(我什至找不到在 zkrp 源代码中返回它的公共(public)方法)。因此,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
来命名不同事物的做法非常令人困惑。我希望这能澄清一点。
关于go - 如何解决 "use of package without a selector error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62423188/