英文:
Cannot use "a" (type string) as type in array element in go
问题
我对Golang还不太熟悉,我在向数组中添加项目方面遇到了问题。
我使用这个链接作为参考golang-book。
我有这个结构体:
package models
type FileMD struct {
fileName string
fileSize int
}
我尝试了两种方法,但都失败了。
fileList := [...]models.FileMD{"a", 1: "b", 2}
var fileList [...]models.FileMD
fileList[0] = "a", 1
正确的方法是什么?
英文:
I'm pretty new to Golang and I have an issue with adding items to Array.
I use this link as a reference golang-book.
I have this struct:
package models
type FileMD struct {
fileName string
fileSize int
}
I tried to do it both ways but I failed.
fileList := [...]models.FileMD{"a", 1: "b", 2}
var fileList [...]models.FileMD
fileList[0] = "a", 1
What is the correct way?
答案1
得分: 4
我不确定,但我认为你正在寻找的是:
fileList[0] = FileMD{"a", 1}
或者可能是:
fileList := []FileMD{{"a", 1}, {"b", 2}}
英文:
I am not sure but I think you are looking for:
fileList[0] = FileMD{"a", 1}
Or maybe:
fileList := []FileMD{{"a", 1}, {"b", 2}}
答案2
得分: 4
首先,你需要决定你想要一个数组(array)还是一个切片(slice)。
一旦你决定了,你基本上有两个选项:
(在Go Playground上尝试完整的应用程序。)
1)使用字面量:###
使用复合字面量(数组字面量或切片字面量)初始化你的数组/切片,然后你就完成了。
数组:
fileArr10 := [2]FileMD{FileMD{"first", 1}, FileMD{"second", 2}}
// 或者简写:
fileArr11 := [2]FileMD{{"first", 1}, {"second", 2}}
// 自动计算长度:
fileArr20 := [...]FileMD{FileMD{"first", 1}, FileMD{"second", 2}}
// 或者简写:
fileArr21 := [...]FileMD{{"first", 1}, {"second", 2}}
切片(注意数组字面量和切片字面量之间唯一的区别是没有指定长度):
fileSl10 := []FileMD{FileMD{"first", 1}, FileMD{"second", 2}}
// 或者简写:
fileSl11 := []FileMD{{"first", 1}, {"second", 2}}
2)创建新的、初始化的数组/切片并填充它:###
创建一个新的、初始化的数组/切片,并通过给其元素赋值来填充它。
数组:
fileArr := [2]FileMD{}
fileArr[0] = FileMD{"first", 1}
fileArr[1] = FileMD{"second", 2}
切片:(你可以使用内置函数make
创建切片)
fileSl := make([]FileMD, 2)
fileSl[0] = FileMD{"first", 1}
fileSl[1] = FileMD{"second", 2}
最后注意
你的结构体FileMD
是一个包的一部分,它包含未导出的字段(字段名以小写字母开头)。
未导出的字段无法从包的外部访问。这也意味着当你创建这样的结构体的值时,无法指定未导出字段的初始值。
因此,如果你尝试从models
包的外部创建一个FileMD
的值,你只能创建零值的FileMD
,如FileMD{}
。将你的字段导出,然后你就可以为文件名和大小指定初始值:
type FileMD struct {
FileName string
FileSize int
}
// 现在,在`models`包的外部,FileMD{"first", 1}是有效的
英文:
First you need to decide if you want an array or a slice.
Once you decided, you have basically 2 options:
(Try the complete application on the Go Playground.)
1) With a literal:
Initialize your array/slice with a Composite literal (either an array or slice literal) and you're done.
Arrays:
fileArr10 := [2]FileMD{FileMD{"first", 1}, FileMD{"second", 2}}
// Or short:
fileArr11 := [2]FileMD{{"first", 1}, {"second", 2}}
// With length auto-computed:
fileArr20 := [...]FileMD{FileMD{"first", 1}, FileMD{"second", 2}}
// Or short:
fileArr21 := [...]FileMD{{"first", 1}, {"second", 2}}
Slices (note the only difference between array and slice literals is that length is not specified):
fileSl10 := []FileMD{FileMD{"first", 1}, FileMD{"second", 2}}
// Or short:
fileSl11 := []FileMD{{"first", 1}, {"second", 2}}
2) New, initialized array/slice and filling it:
Create a new, initialized array/slice and fill it by assiging values to its elements.
Array:
fileArr := [2]FileMD{}
fileArr[0] = FileMD{"first", 1}
fileArr[1] = FileMD{"second", 2}
Slice: (you can create slices with the built-in function make
)
fileSl := make([]FileMD, 2)
fileSl[0] = FileMD{"first", 1}
fileSl[1] = FileMD{"second", 2}
Final Note
Your struct FileMD
is part of a package and it contains unexported fields (fields whose name start with lowercased letters).
Unexported fields are not accessible from outside of the package. This also means that when you create a value of such struct, you cannot specify the initial values of unexported fields.
So if you try to create a value of FileMD
from outside of package models
, you can only create zero-valued FileMD
s like this: FileMD{}
. Make your fields exported and then you can specify the initial values for the file name and size:
type FileMD struct {
FileName string
FileSize int
}
// Now FileMD{"first", 1} is valid outside of package models
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论