当前位置: 首页 > 面试题库 >

迭代Go地图获取索引

赫连宏伯
2023-03-14
问题内容

为了在模板中使用revel‘s’
even关键字,我想在使用进行迭代时获取地图条目的索引range。有什么办法吗?我的地图具有以下结构:

map[string][]string

问题答案:

您不仅可以使用模板操作来执行此操作,还可以注册一个提供必要帮助的函数。

您可以注册一个返回一个函数(闭包)的函数,该函数在每次调用时都会改变其返回值(确切地说,“奇数”和“偶数”索引的交替方式):

func isEven() func() bool {
    e := false
    return func() bool {
        e = !e
        return e
    }
}

我将其命名isEven()为不与ravel的碰撞even()。使用它:

func main() {
    t := template.Must(template.New("").Funcs(template.FuncMap{
        "isEven": isEven,
    }).Parse(templ))

    m := map[string]string{
        "a": "A", "b": "B", "c": "C", "d": "D",
    }
    if err := t.Execute(os.Stdout, m); err != nil {
        panic(err)
    }
}

const templ = `{{$e := isEven}}
{{- range $k, $v := . -}}
    [even:{{call $e}}] key={{$k}}; value={{$v}}
{{end}}`

输出(在Go Playground上尝试):

[even:true] key=a; value=A
[even:false] key=b; value=B
[even:true] key=c; value=C
[even:false] key=d; value=D

如果您希望奇数和偶数迭代具有不同的输出,则可以调用$e一个{{if}}动作,如下所示:

const templ = `{{$e := isEven}}
{{- range $k, $v := . -}}
    [{{if call $e}}even{{else}}odd {{end}}] key={{$k}}; value={{$v}}
{{end}}`

输出(在Go Playground上尝试):

[even] key=a; value=A
[odd ] key=b; value=B
[even] key=c; value=C
[odd ] key=d; value=D

引擎盖下

此模板操作:

{{$e := isEven}}

创建一个名为的新模板变量$e,其值将是isEven()函数调用的结果(返回值)。isEven()返回一个函数值,一个闭包可以访问etype
的局部变量bool。稍后再做时{{call $e}},您不会调用isEven()Go函数,而是返回的函数(闭包)并存储在中$e。该闭包引用了局部bool变量e,直到isEvent()可以访问返回的函数之前,它才“释放”


因此,无论何时执行操作{{call $e}},它都会调用闭包,该闭包“具有” e类型的变量bool,其值在两次调用之间保留$e

如果您再次调用isEvent模板,则将返回一个新函数(闭包),包装一个新的局部变量实例,该实例e独立于第一次isEvent()调用返回的闭包的第一个包装变量。



 类似资料:
  • 问题内容: List rateList = guestList.stream() .map(guest -> buildRate(ageRate, guestRate, guest)) .collect(Collectors.toList()); 在上面的代码中,可以通过内部方法的索引。我在构建时还需要传递索引,但无法通过获取索引。 问题答案: 您尚未提供的签名,但是我假设您希望首先传递元素的索引

  • 在上面的代码中,是否可以在方法内部传递的索引。在构建时,我还需要传递索引,但无法使用获取索引。

  • 我将“User class”类型的变量转换为JsonNode,如下所示: 我需要迭代地循环该节点的每个元素,并获取其键和值,例如:“name”:John,“lastname”:H等等 但是当我做iterator.next()时,我直接得到约翰值,没有键。我需要同时得到键和值。我如何在JsonNode类型的迭代器中访问键?我做错了什么,或者有没有更好的方法来迭代这些属性?

  • 问题内容: 我正在与Go一起使用MongoDB。我有以下代码: k:0 v:地图[_id:ObjectIdHex(“ 536887c199b6d0510964c35b”)transId:A000000000] 我需要从中获取切片中返回的映射值和的值。我怎样才能做到这一点? 问题答案: 我只是在猜测,但万一您只想检索所有 交易 文档并打印它们,方法如下: 假设您有一个代表您收藏的文件的结构,例如:

  • 问题内容: 我在做: 这引发了ConcurrentModificationException,所以我将其更改为: 此操作以及任何其他修改映射的过程都在同步块中。 有更好的解决方案吗? 如果没有人提出更好的解决方案,那么首先要说“没有” 问题答案: 从Java 8开始,你可以执行以下操作:

  • 问题内容: 可能吗? 说你有 并且是“迈克”,“约翰”,“卡伦”。 是否可以不经过迭代就返回“约翰”的索引是“ 1”? 以下工作正常..与此问题,我想知道是否有更好的方法 问题答案: 该接口并没有像作为一种方法。您确实需要对其进行迭代或使用提供方法的接口代替。 如果你想,转换到是很琐碎,它应该是传递的问题通过的构造函数执行。例如