Go 结构体指针初始化
今天遇到一个这样的问题
同样都是查询,上面的就不需要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 结构体指针初始化相关推荐
- c语言+结构体指针初始化,c语言结构体指针初始化===
c语言结构体指针初始化 今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以 ...
- C 结构体指针初始化
原文 C 结构体指针初始化,CSDN同步发布. 转载请注明出处,谢谢! 在使用指针之前,务必要将其初始化.这是我们最早学习 C 语言的时候,书上经常说的一个问题.在工作中,我们反而会经常忘记这条金科玉 ...
- c语言结构体指针初始化
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
- C语言结构体指针初始化(转)
reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...
- c语言中结构体的指针初始化,c语言结构体指针初始化
今天终于看完了C语言深度剖析这本书,对C语言有了进一步的了解与感悟,突然发觉原来自己学C语言的时候学得是那样的迷糊,缺少深入的思考,在重新看书的时候发觉C语言基本教材虽然经典,但是缺乏独到性,老师在讲 ...
- 结构体指针初始化问题
(1)结构体指针是否需要初始化 struct student{ char* name; int score; struct student* next; }stu,*stu1; stu.name=(c ...
- 关于指针结构体的初始化
项目场景: 力扣141:循环链表的判定 在VS中初始化链表,涉及到节点结构体的初始化, 问题描述 在VS中初始化链表,涉及到节点结构体的初始化,一开始的写法: typedef struct ListN ...
- c语言结构体学习整理(结构体初始化,结构体指针)
渣渣c的c语言学习之路 1.关于c语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char -等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用, ...
- 为什么结构体指针需要malloc申请空间
例如此时: int init(struct Node**head ) //结构体指针 初始化 { struct Node *newnode = (struct Node *)malloc(sizeof ...
最新文章
- jquery插件-表单验证插件-提示信息中文化与定制提示信息
- 史上最全的SpringMVC学习笔记
- matlab 基于GUI的PID研究
- 【学习笔记】FI-AR模块概述
- Failed to instantiate [org.springframework.test.context.web.ServletTestExecute
- centos设置ip
- 设计模式:单件模式(Singleton Pattern)
- 堆排序 Heap Sort
- PHP--变量部分知识点
- Windows系统设置共享文件夹及访问共享文件夹
- 2021阿里云ECS镜像导入本地VMware虚拟机
- C# Wpf Binding 使用详解
- mysql rpl_MySQL增强半同步参数rpl_semi_sync_master_wait_point值AFTER_SYNC和AFTER_COMMIT
- Android绕过微信包名限制对接微信登录和支付
- 性能测试工具的 Coordinated Omission 问题
- 2.2 字 母 表 和 符 号 串 的 基 本 概 念
- 币安智能链监听日志事件
- 可怕!只因写了一段爬虫代码,全公司200人被警察一锅端!
- Proteus8.9 VSM Studio GCC编译器仿真STM32F407ZGT6系列011_lcd1602_并口
- 《公司战略与风险管理》