【问题标题】:How to resolve "use of package without a selector error"如何解决“在没有选择器错误的情况下使用包”
【发布时间】:2020-06-17 17:49:25
【问题描述】:

我正在使用一个包: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。

我做错了什么?

【问题讨论】:

    标签: go package


    【解决方案1】:

    对于第一个文件,一切正常,因为代码使用了ccs08 包的公共成员。但是,第二个文件并非如此。

    您提到第二个文件中的代码是从here 复制的。

    要了解为什么代码在粘贴到 ccs08 包之外的 main 方法时不起作用,您需要了解它在其原始位置的作用。具体这部分:

    var (
        result bool
        zkrp   ccs08
    )
    

    在原始位置(在ccs08 包内)有一个名为ccs08 的私有结构类型。声明可见here。上面的代码所做的是创建一个名为zkrp 的变量,其类型是私有结构类型ccs08。那么,变量上调用的各种函数就是绑定到这个私有结构体的方法(可以看方法here)。

    现在,在您发布的代码中(粘贴到 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 包未在代码中的任何位置以有效方式使用。

    老实说,您复制的代码对于所有重用字符串 ccs08zkrp 来命名不同的事物非常令人困惑。我希望这能澄清一点。

    【讨论】:

    • 再补充一点,如果您使用的是this library,那么您想要的功能在ccs08 包中,因此您需要导入"zkrp/ccs08" 并使用ccs08 引用该包代码。
    • 感谢您的回复。我已经尝试过导入 zkrp/ccs08,然后我注释变量 zkrp 并直接使用 ccs08.Setup(),但是当我尝试这样做时,它说 undefined ccs08.Setup ( 对于 main 2 中的所有 ccs08 函数给出相同的错误) 我想知道这里 zkrp 变量有什么用.. 我从 ccs08 包的单元测试中借用了这段代码(你可以在最后的文件 ccs08_test.go 中检查它)。
    • 看到那个单元测试文件后,可以看出我之前的回答是错误的。我希望更新的答案有所帮助。
    • 啊,谢谢。我现在确实理解了这个问题,但仍然不知道如何解决这个问题。如何在 main 中访问这个私有结构?
    • 使用zkrp 代码是不可能的。您现在唯一的选择是 1. 尝试找到一种方法来仅使用公共功能来完成您需要做的事情。 2.复制ccs08结构体代码,粘贴到自己的代码库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多