gpt4 book ai didi

go - 变量在 if 语句中不可访问。语言设计?

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:25 24 4
gpt4 key购买 nike

所以我正在为 Go 实现 Jade 模板语言(参见 https://github.com/go-floki/jade ),并且遇到了该语言的一个有趣的“特性”。下面的代码按预期工作,为每个爆头放置 img 元素。

each $headshot in $object.Headshots
img.img-circle.headshot(src=$headshot)

然后我想更改它,以便在第六个元素上将图像源设为预设图像。但是,当我运行这段代码时出现错误

each $headshot, index in $cause.Headshots
if index == 6
img.img-circle.headshot(src="/public/images/ellipse.png")
else
img.img-circle.headshot(src=$headshot)

特别是 undefined variable $headshot$headshot 似乎不存在于 if 语句的范围内。这不是我第一次使用此实现遇到此行为,尝试变通很令人沮丧。它所带来的麻烦让我想知道,这门语言以这种方式工作可能是有原因的吗?

此外,在这种情况下,任何人都可以想出一种解决“功能”的方法吗?我能想到的最好办法是稍后使用 Javascript 在客户端更改它。

最佳答案

首先,Go 的 if block 可以访问其封闭范围内的变量。如果这在您的示例中失败,那一定是因为您的代码或您使用的库中存在实现错误。

接下来,让我们修复贴出的代码中的一些问题:

each $headshot, index in $cause.Headshots

顺序应该颠倒——索引在前——让我们与使用$来指示变量保持一致:

each $i, $headshot in $cause.Headshots

清理完毕后,这是一个完整的演示脚本:

模板/home.jade

html
body
each $i, $headshot in Cause.Headshots
if $i == 0
img.img-circle.headshot(src="/public/images/ellipse.png")
else
img.img-circle.headshot(src=$headshot)

演示.go

package main

import (
"bufio"
"os"

"github.com/go-floki/jade"
)

func main() {
w := bufio.NewWriter(os.Stdout)
// compile templates
templates, err := jade.CompileDir("./templates", jade.DefaultDirOptions, jade.Options{})
if err != nil {
panic(err)
}

// then render some template
tpl := templates["home"]
tpl.Execute(w, map[string]interface{}{
"Cause": map[string]interface{}{
"Headshots": []string{"one", "two"},
},
})
w.Flush()
}

这段代码对我有用,输出是:

<html><body><img class="img-circle headshot" src="/public/images/ellipse.png" /><img class="img-circle headshot" src="two" /></body></html>

所以我唯一的结论是,您的示例中肯定还有其他原因。这可能是库中的错误,但我会首先检查以下内容:

  • jade 文件中是否混合了空格和制表符?这可能会导致范围混淆
  • 我在上面发布的示例是否也给您一个错误?如果是这样,
    • 您使用的是最新版本的 Jade 库吗?
    • 您的 Go 版本是最新的吗?

关于go - 变量在 if 语句中不可访问。语言设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com