英文:
Initialize array of arrays with different sizes in Golang
问题
在Golang中,我想初始化一个数组的数组,用来表示一年的数据。
主数组将有12个子数组,每个子数组代表一个月。每个子数组的大小将根据它们代表的月份而定。
例如,第0个子数组将代表一月,并包含31个元素;第1个子数组将代表二月,并包含29个元素(考虑闰年),依此类推。
在Golang中,多维数组可以使用[12][30]int
这样的方式进行初始化,但在这里,我需要使用不同大小的多维数组。我该如何初始化这样一种数据类型的变量呢?
简而言之,我想做的事情类似于这样:
var year = [12][31]int{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}}
但是我在语法上遇到了困难。有人可以帮我解决吗?谢谢!
英文:
In Golang, I want to initialize an array of arrays which can represent an year.
The main array will have 12 sub-arrays each will represent a month. Each subarray will have size of the month they represent.
For eg, 0th sub-array will reference January and will contain 31 elements, 1st sub-array will reference February and will contain 29 elements (considering a leap year) and so on...
Multi-dimensional arrays are initialized like [12][30]int
in Golang considering the fixed size. But here, I am working with a multidimensional array of different sizes. How do I initialize a variable with such a datatype?
In short, I want to do something like this:
var year [[31]int, [29]int, [31]int, [30]int, [31]int, [30]int, [31]int, [31]int, [30]int, [31]int, [30]int, [31]int]
But I am struggling with the syntax. Could someone please help me out? Thanks!!
答案1
得分: 2
你想要这样的代码吗?
package main
import "fmt"
func main() {
days := []int{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
months := [12][]int{}
for i := 0; i < 12; i++ {
months[i] = make([]int, days[i])
fmt.Println(i, months[i], len(months[i]))
}
}
在 Go Playground 上运行:链接
英文:
You want something like this?
package main
import "fmt"
func main() {
days := []int{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
months := [12][]int{}
for i := 0; i < 12; i++ {
months[i] = make([]int, days[i])
fmt.Println(i, months[i], len(months[i]))
}
}
run in go playground
答案2
得分: 2
稍微更一致的答案参考@Sakib。我假设你也想填写日期。
days := []int{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
months := make([][]int, len(days))
for i := 0; i < 12; i++ {
months[i] = make([]int, days[i])
for j := 0; j < days[i]; j++ {
months[i][j] = j + 1
}
fmt.Println(i+1, months[i])
}
英文:
A slightly more consistent answer reference @Sakib. And I assumed you wanted the dates to be filled too.
days := []int{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
months := make([][]int, len(days))
for i := 0; i < 12; i++ {
months[i] = make([]int, days[i])
for j := 0; j < days[i]; j++ {
months[i][j] = j + 1
}
fmt.Println(i+1, months[i])
}
答案3
得分: 1
如果你想要初始化一个表示年份的二维数组,其中多维数组的初始化方式类似于 [12][30]int,我认为以下代码可以解决你的问题:
package main
import (
"errors"
"fmt"
"log"
"strconv"
"time"
)
func main() {
years := []int{
2022,
1972,
2021,
2020,
}
var s string
for _, year := range years {
s = ""
ret, err := GetYearDays(year)
if err != nil {
log.Fatal(err)
}
for i := range ret {
s = s + " " + strconv.Itoa(len(ret[i]))
}
log.Printf("year: %d, month days:%s\n", year, s)
}
}
func GetYearDays(year int) (ret [12][]int, err error) {
// year check depends on the user
if year < 1952 || year > 3000 {
return ret, errors.New("invalid year")
}
for idx := range ret {
firstDay, err := time.Parse("2006-1-2", fmt.Sprintf("%d-%d-1", year, idx+1))
if err != nil {
return ret, fmt.Errorf("time invalid, year: %d, month: %d", year, idx+1)
}
lastDay := firstDay.AddDate(0, 1, -1)
ret[idx] = make([]int, lastDay.Day())
}
return ret, err
}
希望对你有帮助!
英文:
if you want to initialize an array of arrays which can represent an year and multi-dimensional arrays are initialized like [12][30]int, I think this code may solve your problem:
package main
import (
"errors"
"fmt"
"log"
"strconv"
"time"
)
func main() {
years := []int{
2022,
1972,
2021,
2020,
}
var s string
for _, year := range years {
s = ""
ret, err := GetYearDays(year)
if err != nil {
log.Fatal(err)
}
for i := range ret {
s = s + " " + strconv.Itoa(len(ret[i]))
}
log.Printf("year: %d, month days:%s\n", year, s)
}
}
func GetYearDays(year int) (ret [12][]int, err error) {
// year check depends on the user
if year < 1952 || year > 3000 {
return ret, errors.New("invalid year")
}
for idx := range ret {
firstDay, err := time.Parse("2006-1-2", fmt.Sprintf("%d-%d-1", year, idx+1))
if err != nil {
return ret, fmt.Errorf("time invalid, year: %d, month: %d", year, idx+1)
}
lastDay := firstDay.AddDate(0, 1, -1)
ret[idx] = make([]int, lastDay.Day())
}
return ret, err
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论