Golang中如何初始化代表年份的不等长嵌套数组?
在Go中创建月份天数可变的年份嵌套结构
在Go里,你没法直接定义由不同长度数组组成的数组——因为数组的长度是其类型的一部分,[31]int和[29]int属于完全不同的类型,不能放在同一个数组中。你需要改用切片的切片([][]int)来实现需求,每个子切片对应一个月份的天数。
实现步骤
- 先实现闰年判断逻辑,用来确定2月的天数;
- 定义各月份的天数列表(根据闰年动态调整2月);
- 初始化外层切片,再为每个月份创建对应长度的子切片。
代码示例
package main import "fmt" // 判断是否为闰年 func isLeapYear(year int) bool { return year%4 == 0 && (year%100 != 0 || year%400 == 0) } func main() { targetYear := 2024 // 可替换为任意年份 // 定义各月份的基础天数 monthDays := []int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} if isLeapYear(targetYear) { monthDays[1] = 29 // 闰年调整2月天数 } // 初始化年份切片的切片 year := make([][]int, 12) for i := 0; i < 12; i++ { year[i] = make([]int, monthDays[i]) // 可选:给每个元素赋初始值,比如对应日期 for j := range year[i] { year[i][j] = j + 1 } } // 验证结果 for idx, month := range year { fmt.Printf("%d月有%d天,前3个元素:%v\n", idx+1, len(month), month[:3]) } }
非闰年的简化初始化写法
如果不需要动态处理闰年,也可以直接用字面量初始化:
func main() { year := [][]int{ make([]int, 31), make([]int, 28), make([]int, 31), make([]int, 30), make([]int, 31), make([]int, 30), make([]int, 31), make([]int, 31), make([]int, 30), make([]int, 31), make([]int, 30), make([]int, 31), } fmt.Println("1月长度:", len(year[0])) // 输出31 fmt.Println("2月长度:", len(year[1])) // 输出28 }
关键说明
[][]int是切片的切片,外层切片的每个元素都是[]int类型的切片,切片长度可动态变化,完美适配不同月份的天数需求;- 若需要给日期元素赋值,初始化子切片后循环赋值即可,示例中直接将元素设为对应的日期数。
内容的提问来源于stack exchange,提问作者Krushnal Patel
相关产品推荐
相关产品推荐

