今天遇到一个这样的问题

同样都是查询,上面的就不需要new, 而下面的就需要new
请教了一下大佬,
下面的是一个结构体指针,需要分配内存才能使用
在别的地方也找到了印证,(尽管之前博客提到过这个问题,)


官方文档

// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type

翻译出来就是:new是一个分配内存的内置函数,第一个参数是类型,而不是值,返回的值是指向该类型新分配的零值的指针。 我们平常在使用指针的时候是需要分配内存空间的,未分配内存空间的指针直接使用会使程序崩溃,

var b *int8
*b = 10

比如这样就报错了。
声明了一个指针变量,直接就去使用它,就会使用程序触发panic,因为现在这个指针变量在内存中没有块地址属于它,就无法直接使用该指针变量,所以new函数的作用就出现了,通过new来分配一下内存,就没有问题

var b *int64 = new(int64)*b = 10

// 数组array := new([5]int)fmt.Printf("-array:-%p---%#v---\n", &array, array)//-array:-0xc000006028---&[5]int{0, 0, 0, 0, 0}---//array[0] = 2(*array)[0] = 2fmt.Printf("-array:-%p---%#v---\n", &array, array) //-array:-0xc000006028---&[5]int{2, 0, 0, 0, 0}---
// 切片slice := new([]int8)fmt.Printf("-slice:-%p---%#v---\n", &slice, slice) //--slice:-0xc000006038---&[]int8(nil)---(*slice)[0] = 2//slice[2] = 5 // invalid operation: slice[2] (type *[]int8 does not support indexing)fmt.Printf("-slice:-%p---%#v---\n", &slice, slice)//panic: runtime error: index out of range [0] with length 0
//mapm := new(map[string]int)fmt.Printf("--map:--%p------%3v\n", &m, m) //--map:--0xc000006028------&map[](*m)["xiaosheng"] = 4fmt.Printf("--map:--%p------%3v\n", &m, m) //panic: assignment to entry in nil map
// channel// channelchanne := new(chan string) //--chan:--0xc000006028------0xc000006030fmt.Printf("--chan:--%p------%3v\n", &channe, channe)channe <- "ddd"  // invalid operation: channe <- "ddd" (send to non-chan type *chan string)

使用new函数分配内存后,只有数组在初始化后可以直接使用,slice、map、chan初始化后还是不能使用,会触发panic,这是因为slice、map、chan基本数据结构是一个struct,也就是说他里面的成员变量仍未进行初始化,所以他们初始化要使用make来进行,make会初始化他们的内部结构


下面这段代码在执行时候会触发panic, 我猜测是因为长度没有分配,而对一个长度没有分配的数组进行索引操作,就报索引越界错误,有大佬知道的话欢迎指点一下,

 m := make([]int, 0, 10)m[8] = 12fmt.Println(m)

Go 结构体指针初始化相关推荐

  1. c语言+结构体指针初始化,c语言结构体指针初始化===

    c语言结构体指针初始化 今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以 ...

  2. C 结构体指针初始化

    原文 C 结构体指针初始化,CSDN同步发布. 转载请注明出处,谢谢! 在使用指针之前,务必要将其初始化.这是我们最早学习 C 语言的时候,书上经常说的一个问题.在工作中,我们反而会经常忘记这条金科玉 ...

  3. c语言结构体指针初始化

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  4. C语言结构体指针初始化(转)

    reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...

  5. c语言中结构体的指针初始化,c语言结构体指针初始化

    今天终于看完了C语言深度剖析这本书,对C语言有了进一步的了解与感悟,突然发觉原来自己学C语言的时候学得是那样的迷糊,缺少深入的思考,在重新看书的时候发觉C语言基本教材虽然经典,但是缺乏独到性,老师在讲 ...

  6. 结构体指针初始化问题

    (1)结构体指针是否需要初始化 struct student{ char* name; int score; struct student* next; }stu,*stu1; stu.name=(c ...

  7. 关于指针结构体的初始化

    项目场景: 力扣141:循环链表的判定 在VS中初始化链表,涉及到节点结构体的初始化, 问题描述 在VS中初始化链表,涉及到节点结构体的初始化,一开始的写法: typedef struct ListN ...

  8. c语言结构体学习整理(结构体初始化,结构体指针)

    渣渣c的c语言学习之路 1.关于c语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char -等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用, ...

  9. 为什么结构体指针需要malloc申请空间

    例如此时: int init(struct Node**head ) //结构体指针 初始化 { struct Node *newnode = (struct Node *)malloc(sizeof ...

最新文章

  1. jquery插件-表单验证插件-提示信息中文化与定制提示信息
  2. 史上最全的SpringMVC学习笔记
  3. matlab 基于GUI的PID研究
  4. 【学习笔记】FI-AR模块概述
  5. Failed to instantiate [org.springframework.test.context.web.ServletTestExecute
  6. centos设置ip
  7. 设计模式:单件模式(Singleton Pattern)
  8. 堆排序 Heap Sort
  9. PHP--变量部分知识点
  10. Windows系统设置共享文件夹及访问共享文件夹
  11. 2021阿里云ECS镜像导入本地VMware虚拟机
  12. C# Wpf Binding 使用详解
  13. mysql rpl_MySQL增强半同步参数rpl_semi_sync_master_wait_point值AFTER_SYNC和AFTER_COMMIT
  14. Android绕过微信包名限制对接微信登录和支付
  15. 性能测试工具的 Coordinated Omission 问题
  16. 2.2   字 母 表 和 符 号 串 的 基 本 概 念
  17. 币安智能链监听日志事件
  18. 可怕!只因写了一段爬虫代码,全公司200人被警察一锅端!
  19. Proteus8.9 VSM Studio GCC编译器仿真STM32F407ZGT6系列011_lcd1602_并口
  20. 《公司战略与风险管理》

热门文章

  1. 数据库——数据库完整性
  2. 线程池ThreadPool详解
  3. java 求e_Java求自然对数底e的值 | 学步园
  4. linux下logcat命令,adb logcat 命令
  5. 人脸识别系统开题报告,BP神经网络图像识别
  6. 大模型,化繁为简归文心
  7. 如何判断字符串是否为JSON格式
  8. 我理解的企业技术管理(一)——什么是技术管理
  9. 擎创技术流 | ClickHouse实用工具—ckman教程(15)
  10. 指针的进阶应用之双指针、三指针