为什么golang slice在初始化后是空的?

时间:2017-02-09 14:01:50

标签: go slice

我的问题是,当切片对文件是全局的时,切片在另一个func中为空?

这是一段代码:

package main

import "fmt"

type Vec3 struct {
    x float32
    y float32
    z float32
}

var a []Vec3

func main() {
  a := make([]Vec3, 0)

  a = append(a, Vec3{2.0, 3.0, 4.0})
  a = append(a, Vec3{3.4, 5.6, 5.4})
  a = append(a, Vec3{6.7, 4.5, 7.8})

  fmt.Printf("%+v\n", a)
  doSomethingWithA();
}

func doSomethingWithA() {
  fmt.Printf("%+v\n", a)
}

输出:

[{x:2 y:3 z:4} {x:3.4 y:5.6 z:5.4} {x:6.7 y:4.5 z:7.8}]
[]

This也是一个repl.it链接,如果你想看看。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您已在此处重新定义:

a := make([]Vec3, 0)

要使用相同的变量,您应该使用=分配值,但不要使用:=声明新变量

a = make([]Vec3, 0)

Short variable declarations

  

在函数内部,可以使用:= short赋值语句代替具有隐式类型的var声明。

答案 1 :(得分:3)

您正在重新声明a,所以实际上您没有初始化全局变量,请尝试:

a = make([]Vec3, 0)