如何在for循环中基于结构声明变量

Fre*_*red 1 struct loops go

这是一个在 for 循环之前声明变量的工作程序。

package main

import "fmt"

type brackets struct {
    ch   string
    pos  int
}

type stack []brackets

func main() {
    p := brackets{ch: "a"}
    st := make(stack,0)
    for i :=  0; i < 3; i++ {
        p = brackets{ch: "a", pos: 1}
        st = append(st, p) 
        fmt.Println(p)
        fmt.Println(st)
    }
}
Run Code Online (Sandbox Code Playgroud)

我想声明相同的变量作为 for 循环的一部分。如何?这是一个错误的尝试。

package main

import "fmt"

type brackets struct {
    ch   string
    pos  int
}

type stack []brackets

func main() {
//    p := brackets{ch: "a"}
//    st := make(stack,0)
    for st, p, i :=  make(stack,0), brackets{ch: "a"}, 0; i < 3; i++ {
        p = brackets{ch: "a", pos: 1}
        st = append(st, p) 
        fmt.Println(p)
        fmt.Println(st)
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:语法错误:st, p, i := make(stack, 0), 括号用作值

我很困惑,因为声明标准类型(如整数和字符串)非常容易。为什么不是我的结构?

Cer*_*món 7

规范复合文字部分说:

当使用 LiteralType 的 TypeName 形式的复合文字作为关键字和“if”、“for”或“switch”语句块的左大括号之间的操作数出现,并且复合文字是不包含在圆括号、方括号或花括号中。在这种罕见的情况下,文字的左大括号被错误地解析为引入语句块的大括号。为了解决歧义,复合文字必须出现在括号内。

通过在复合文字周围添加括号来修复代码:

for st, p, i :=  make(stack,0), (brackets{ch: "a"}), 0; i < 3; i++ {
    p = brackets{ch: "a", pos: 1}
    st = append(st, p) 
    fmt.Println(p)
    fmt.Println(st)
}
Run Code Online (Sandbox Code Playgroud)

在操场上运行它