初级会员
  • 第 6964 位会员
  • huangxianghan
  • huangxianghan@qq.com
  • 2016-12-19 15:23:51

最近发布的主题

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 不用递归就用广度搜索算法,就是利用列队遍历来代替递归。 代码如下: var QueueEOF = errors.New("queue is emtity") //用数组实现的简单列队 type stringQueue struct { next int data []string } func newStrQueue() *stringQueue { return &stringQueue{data: make([]string, 0, 1024)} } func (que *stringQueue) add(el string) { que.data = append(que.data, el) } func (que *stringQueue) pop() (string, error) { if que.next >= len(que.data) { return "", QueueEOF } nextStr := que.data[que.next] que.next++ return nextStr, nil } //广度搜索算法 func bfsFile(folder string) { var ( path string err error files []os.FileInfo ) //目录遍历队列 que := newStrQueue() //根目录入队 que.add(folder) //循环到列队不再有元素 for { if path, err = que.pop(); err != nil { break } if files, err = ioutil.ReadDir(path); err != nil { break } for _, f := range files { if f.IsDir() { //子目录入队 que.add(path + "/" + f.Name()) } else { //处理文件 //fmt.Println(path + "/" + f.Name()) } } } }
  • 看了下你的代码,我觉得你的代码的意图是,创建一个bool的chan 每个线程结束通知这个通道。 然后再通过遍历这个通道来达到等待所有线程都执行结束的目的。 但是完全不需要用到通道。直接用WaitGroup就行了。 不知道你是否这个意图。至少你代码展现是这个意图。 以下使用WaitGroup的例子。 package main import ( "fmt" "sync" ) func main() { //如果想用和cpu同等数量的线程,这句根本不需要,go默认就是。 //runtime.GOMAXPROCS(runtime.NumCPU()) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go Go(&wg, i) } wg.Wait() } func Go(wg *sync.WaitGroup, index int) { //defer 的作用不单单是结束才运行,它是保证函数出错了也运行的机制。 //但对性能有影响,如果这函数永远不会发生运行时错误,最好加到末尾。 defer wg.Done() a := 0 for i := 0; i < 10000000; i++ { a += i } fmt.Println(index, a) //wg.Done() }
  • 你这描述,不对吧。你试试函数参数传递结构体和结构体指针看看? 应该说,结构体的指针,会隐式解指针。 也就是说 p.X = 1e9 编译器已经帮你做了 (*p).X = 1e9 这步。