当前位置: 首页 > news >正文

Golang new() make var []int 使用的具体区别

一、数组和切片的初始化

1 var  []int  格式

func main() {var t1 []intt1 = append(t1, 1)fmt.Println(t1) //正常输出 1var t11 []intt11[0] = 11 //panic: runtime error: index out of range [0] with length 0fmt.Println(t11)var t12 [1]intt12[0] = 12fmt.Println(t12) //正常输出 12var t13 [0]intt13[0] = 13 //编译报错 Invalid array index '0' (out of bounds for the 0-element array)fmt.Println(t33)
}

注意:没有 t12.append()方法

2  make([]int)  格式

func main() {t2 := make([]int, 0)t2 = append(t2, 2)fmt.Println(t2) //正常输出 2t21 := make([]int, 0)t21[0] = 21   //panic: runtime error: index out of range [0] with length 0fmt.Println(t21)t22 := make([]int, 1)t22[0] = 22fmt.Println(t22) //正常输出 22t22=append(t22, 1)fmt.Println(t22) //正常输出 [22 ,1]t23 := make([]int, 0, 0)t23 = append(t23, 23)t23[0] = 1fmt.Println(t23) //正常输出 1t23[1] = 2       //panic: runtime error: index out of range [1] with length 1fmt.Println(t23)
}

    注意: t22.append()方法

3   []int{}  格式

func main(){t3 := []int{}t3 = append(t3, 3)fmt.Println(t3) //正常输出 3t31 := []int{}t31[0] = 31 //panic: runtime error: index out of range [0] with length 0fmt.Println(t31)t32 := [1]int{}t32[0] = 32fmt.Println(t32) //正常输出 32t33 := [0]int{}t33[0] = 33 //编译报错 Invalid array index '0' (out of bounds for the 0-element array)fmt.Println(t33)}

  注意:没有 t32.append()方法

4 new([]int)

func main(){t4 := new([]int)(*t4) = append((*t4), 4)fmt.Println(*t4) //正常输出 4t41 := new([]int) //返回的内存地址(*t41)[0] = 41    //panic: runtime error: index out of range [0] with length 0fmt.Println(*t41)t42 := new([1]int) //返回的内存地址(*t42)[0] = 42fmt.Println(*t42) //正常输出 42t43 := new([0]int) (*t43)[0] = 43     //编译报错  Invalid array index '0' (out of bounds for the 0-element array)fmt.Println(*t43)
}

  注意:没有 t42.append()方法

5 场景分析

        从上面的情况可以总结一下几点:

 (1)  var t1 []int ,   t2 := make([]int, 0) ,  t3 := []int{}  ,  t4 := new([]int):

         都有appeng方法,且 t =  appeng(t,1)  可以正常插入数据;

         t[0]=1 都插入数据失败,报 panic: runtime error: index out of range [0] with length

(2)  var t12 [0]int,  t22 := make([]int, 0,0),t32 := [0]int{}, t42 := new([0]int):

        只有make([]int, 0,0) 有append方法,t=append(t,1)可以成功插入数据,

       也是只有且只有make([]int, 0,0) 有t[0]=1, 且在append扩出来的空间内进行t[i]=3的赋值操作,超过会报panic;

(3) var t12 [1]int,  t22 := make([]int, 1),t32 := [1]int{}, t42 := new([1]int):

      只有 t22 := make([]int, 1)有append方法t =  appeng(t,1)可以正常插入数据

      t[0]=1 都插入数据成功

6 总结

        初始化数组为nil,可以append插入数据,不能用下标t[i]=1插入数据;

        初始化数值长度为0,没有append方法,t[0]=1也会在编译时报错;

        初始化数组长度>0,没有append方法,用下标t[i]=1的方法可以正常插入数据;

        初始化一个长度为0容量为nil的切片即make([]int, 0) ,t =  appeng(t,1)可以正常插入数据;

        初始化一个长度为0容量为nil的切片即make([]int, 0,0),t =  appeng(t,1)可以正常插入数据;

        初始化一个长度为1容量为nil的切片即make([]int, 1),t =  appeng(t,1)可以正常插入数据;

7 基本规则

        初始化的数组和切片只有长度>0,且在数组和切片长度范围内可以用下标的方式赋值;

        在数组长度已经确定的情况下即数组长度>=0,数组没有append()方法,需要用下标去插入数据;

        切片可以比较灵活的用append方法去插入数据,但是用下标插入数据要遵循第一条规则。

二、Map的初始化

1  make(map[string]int)

func main(){var m1 = make(map[string]int)m1["a1"] = 1fmt.Println(m1)  //输出 map[a1:1]
}

2  var map [string]int

func main(){var m2 map[string]intm2["a2"] = 2 //panic: assignment to entry in nil mapfmt.Println(m2)
}

认准 make(map[string]int)的用法去初始化map即可;

http://www.lryc.cn/news/473788.html

相关文章:

  • 【Linux驱动开发】多线程调用驱动时的并发与竞争(原子操作、自旋锁、信号量、互斥锁)
  • qt QComboBox详解
  • redis做缓存,mysql的数据怎么与redis进行同步(双写一致性)
  • WPF触发器
  • 反序列化漏洞的运行原理及防御方法
  • 护眼大路灯哪个牌子好?口碑最好的护眼灯品牌​​
  • Redis 初学者指南
  • node.js_npm : 无法加载文件 D:\Program Files\nodejs\npm.ps1
  • 技术星河中的璀璨灯塔 —— 青云交的非凡成长之路
  • 使用 Git 命令将本地项目上传到 GitLab
  • JavaScript的第十三天
  • el-table 滚动条重置 手动控制滚动条
  • 详细分析Vue3中的provide和inject基本知识(附Demo)
  • spring集成kafka
  • el-form表单中含有el-input按回车自动刷新如何阻止
  • Spring Boot2.x教程:(十)从Field injection is not recommended谈谈依赖注入
  • 在 Android Studio 上运行 Java 的 main 函数
  • 【Nas】X-DOC:Mac mini 安装 ZeroTier 并替换 planet 实现内网穿透
  • Spring Boot 集成 RabbitMQ
  • 存在sql注入的公网站点
  • linux之网络子系统- 内核发送数据包流程以及相关实际问题
  • UDP 实现的 Echo Server 和 Echo Client 回显程序
  • AUTOSAR CP MCAL微控制器抽象层介绍
  • SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式
  • 飞桨首创 FlashMask :加速大模型灵活注意力掩码计算,长序列训练的利器
  • 【含文档+源码】基于SpringBoot+Vue的新型吃住玩一体化旅游管理系统的设计与实现
  • 【网络安全】揭示 Web 缓存污染与欺骗漏洞
  • PHP如何防止防止源代码的暴露
  • C++智能指针的实现
  • 硅谷(12)菜单管理