小编use*_*740的帖子

导入应用程序中的本地库和文件

我是Go的新手(但不是编程),我喜欢这种语言,但我完全理解我应该通过包在应用程序中创建内部库的方式有点麻烦.作为参考,获取外部包然后导入/使用它们很好.

假设我正在申请A.

/home/me/A/a.go (package main)
Run Code Online (Sandbox Code Playgroud)

然后,我意识到a.go开始变得相当大,所以我把它分成两部分

/home/me/A/a.go (package main)
/home/me/A/b.go (package main)
Run Code Online (Sandbox Code Playgroud)

我怎么能从a.go导入/包含b.go以使其功能可用?

作为问题的延续,在A中我操纵了很多对象O,所以我认为如果我给它们自己的包并将功能封装在公共/导出的api中会更好.我怎么做 ?

我已经尝试创建./lib/o.go(包o),import lib/o但我一直得到错误

./a.go:6: imported and not used: "o"
./a.go:43: undefined: o
Run Code Online (Sandbox Code Playgroud)

我的环境中没有GOPATH,但我尝试export GOPATH=$GOPATH:/home/me/A了并没有改变结果.

我试过阅读关于"go layout"的文章,但它立刻感觉有点压倒性的,我真的很想要一个更简单的解释我试图做的那个"小"步骤

谢谢 !

GOPATH/src目录/我/一个/ a.go:

package main

func main() {
        test()
}
Run Code Online (Sandbox Code Playgroud)

GOPATH/src目录/我/一个/ test.go:

package main

import "fmt"

func test() {
        fmt.Println("test func !")
}
Run Code Online (Sandbox Code Playgroud)

高管:

$ go run a.go 
# command-line-arguments 
./a.go:4: undefined: test
Run Code Online (Sandbox Code Playgroud)

编辑:在这里得到我的答案:https://groups.google.com/forum/?fromgroups#!topic / golang -nuts/qysy2bM_o1I

在go run( …

package go

9
推荐指数
1
解决办法
7859
查看次数

与频道和goroutines同步

我正在尝试实施一个"工人"系统,但我遇到了一些问题,以确定它为什么会陷入僵局

代码通过调用fillQueue()来执行

我不明白为什么我的代码最终在一个dealock中(正在进程在"process()"的第二行等待,从通道"queue"读取,而另一个在"fillQueue()"结束时等待等着从服务员那里读.

我不明白为什么它从未得到服务员的阅读.

func process(queue chan *entry, waiters chan bool) {
        for {
                entry, ok := <-queue
                if ok == false {
                        break
                }
                fmt.Println("worker: " + entry.name)
                entry.name = "whatever"
        }
        fmt.Println("worker finished")
        waiters <- true
}

func fillQueue(q *myQueue) {
        // fill our queue                                                                                                                                                                       
        queue := make(chan *entry, len(q.pool))
        for _, entry := range q.pool {
                fmt.Println("push entry")
                queue <- entry
        }
        fmt.Printf("entry cap: %d\n", cap(queue))
        // start the readers                                                                                                                                                                    
        var total_threads int
        if q.maxConcurrent <= len(q.pool) …
Run Code Online (Sandbox Code Playgroud)

deadlock channel go

2
推荐指数
1
解决办法
391
查看次数

指向实现相同接口的不同结构的指针数组

我要做的是:我有几种结构类型,都实现了相同的接口,它声明了一个方法,比如"Process()"

type Worker interface {
  Process()
}

type obj1 struct {
}

func (o *obj1) Process() {
}

// same with struct type obj2, obj3, ...
Run Code Online (Sandbox Code Playgroud)

在整个代码中,我创建了这些结构的几个实例,然后我想在每个结构上调用该进程.每次调用Process()都可以正常工作.

o1 := obj1.New()
o2 := obj1.New()
o3 := obj2.New()
o4 := obj3.New()
// ...
o1.Process()
o2.Process()
// ...
Run Code Online (Sandbox Code Playgroud)

现在,我希望有一个"ProcessAll()"函数,它将接收这些实例并完成对每个实例调用Process()方法的工作,以及围绕它的一些元工作.

这是我正在尝试生成的那种代码,但是这个特定的代码段不起作用,因为我不知道该怎么做:

func ProcessAll(objs []*Worker) {
   for _, obj := range objs {
     obj.Process()
   }
}

ProcessAll([]*Worker{o1, o2, /* ... */})
Run Code Online (Sandbox Code Playgroud)

是这样的事情可以用go完成,如果是的话我该如何实现呢?

polymorphism interface go

2
推荐指数
1
解决办法
240
查看次数

标签 统计

go ×3

channel ×1

deadlock ×1

interface ×1

package ×1

polymorphism ×1