本文整理汇总了Golang中github.com/attic-labs/noms/go/types.Value.ChildValues方法的典型用法代码示例。如果您正苦于以下问题:Golang Value.ChildValues方法的具体用法?Golang Value.ChildValues怎么用?Golang Value.ChildValues使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/attic-labs/noms/go/types.Value
的用法示例。
在下文中一共展示了Value.ChildValues方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: doTreeWalkP
func doTreeWalkP(v types.Value, vr types.ValueReader, cb SomeCallback, concurrency int) {
rq := newRefQueue()
f := newFailure()
visited := map[hash.Hash]bool{}
mu := sync.Mutex{}
wg := sync.WaitGroup{}
var processVal func(v types.Value, r *types.Ref)
processVal = func(v types.Value, r *types.Ref) {
if cb(v, r) {
return
}
if sr, ok := v.(types.Ref); ok {
wg.Add(1)
rq.tail() <- sr
} else {
switch coll := v.(type) {
case types.List:
coll.IterAll(func(c types.Value, index uint64) {
processVal(c, nil)
})
case types.Set:
coll.IterAll(func(c types.Value) {
processVal(c, nil)
})
case types.Map:
coll.IterAll(func(k, c types.Value) {
processVal(k, nil)
processVal(c, nil)
})
default:
for _, c := range v.ChildValues() {
processVal(c, nil)
}
}
}
}
processRef := func(r types.Ref) {
defer wg.Done()
mu.Lock()
skip := visited[r.TargetHash()]
visited[r.TargetHash()] = true
mu.Unlock()
if skip || f.didFail() {
return
}
target := r.TargetHash()
v := vr.ReadValue(target)
if v == nil {
f.fail(fmt.Errorf("Attempt to copy absent ref:%s", target.String()))
return
}
processVal(v, &r)
}
iter := func() {
for r := range rq.head() {
processRef(r)
}
}
for i := 0; i < concurrency; i++ {
go iter()
}
processVal(v, nil)
wg.Wait()
rq.close()
f.checkNotFailed()
}