go结构体初始化_golang中结构体的初始化方法(new方法)
自定义一个结构体
type Rect struct {
x, y float64
width, height float64
}
初始化方法:
rect1 := new(Rect)
rect2 := &Rect{}
rect3 := &Rect{0, 0, 100, 200}
rect4 := &Rect{width:100, height:200}
注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符.而如果使用方法
a := Rect{}
则表示这个是一个Rect{}类型.两者是不一样的.参考代码:
func main() {
rect1 := &Rect{0, 0, 100, 200}
rect1.x = 10
a := Rect{}
a.x = 15
fmt.Printf("%v\n%T\n", a, a)
fmt.Printf("%v\n%T\n", rect1, rect1)
}
运行结果为:
{15 0 0 0}
main.Rect
&{10 0 100 200}
*main.Rect
从结果中可以清楚的看到两者的不同.
在Go语言中,未进行初始化的变量都会被初始化为该类型的零值,例如bool类型的零值为false, int类型的零值为0, string类型的零值为空字符串. 在Go语言中没有构造函数的概念,对象的创建通常交由一个全局的创建函数来完成,以NewXXX来命令,表示"构造函数":
func NewRect(x ,y ,width, height float64) *Rect {
return &Rect{x, y, width, height}
}
这一切非常自然.开发者也不需要分析在使用了new之后到底背后发生了多少事情.在Go语言中,一切要发生的事情都直接可以看到. 附:
用 new 分配内存 内建函数 new 本质上说跟其他语言中的同名函数功能一样:new(T) 分配了零值填充的 T 类型的内存空间,并且返回其地址,一个 *T 类型的值。用 Go 的术语说,它返回了一个指针,指向新分配的类型 T 的零值。记住这点非常重要。 这意味着使用者可以用 new 创建一个数据结构的实例并且可以直接工作。如 bytes.Buffer的文档所述 “Buffer 的零值是一个准备好了的空缓冲。” 类似的,sync.Mutex 也没有明确的构造函数或 Init 方法。取而代之,sync.Mutex 的零值被定义为非锁定的互斥量。 零值是非常有用的。例如这样的类型定义,56 页的”定义自己的类型” 内容。 ===================
务必记得 make 仅适用于 map,slice 和 channel,并且返回的不是指针。应当用 new获得特定的指针。
go结构体初始化_golang中结构体的初始化方法(new方法)相关推荐
- go结构体初始化_golang中结构体的初始化方法
目录 1.自定义一个结构体 type Vertex struct { X, Y float64 } 2.初始化方法-指针: rect1 := new(Vertex ) rect2 := &Ve ...
- go结构体初始化_golang中结构体的初始化方法(new方法) | 学习笔记
自定义一个结构体 1 2 3 4type Rect struct { x, y float64 width, height float64 } 初始化方法: 1 2 3 4rect1 :=new(Re ...
- golang 结构体断言_Golang中的reflect原理
反射(reflect)是在计算机程序运行时,访问,检查,修改它自身的一种能力,是元编程的一种形式.在Java等语言中都很好地支持了反射.Golang也实现了反射,主要核心位于reflect包,官方文档 ...
- java发送c语言结构体_C语言中结构体直接赋值?
在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...
- C语言结构体与C++中结构体和类的区别
在C++中除了类中可以有构造函数和析构函数外,结构体中也可以包含构造函数和析构函数,这是因为结构体和类基本雷同,唯一区别是,类中成员变量默认为私有,而结构体中则为公有.注意,C++中的结构体是可以有析 ...
- c 结构体转byte_C中结构体和字节流的互换及内存对齐
mystruct p; char buff[50]; memcpy(buff,&p,sizeof(p)); //把p的内容以字节形式拷贝到buff中 mystruct* q; q = (mys ...
- java为什么要初始化_JAVA中到底要怎么样初始化
Java中的变量作用范围: 1. 类的属性,或者叫值域 2. 方法里的局部变量 3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化.如果给出了初始值,则初始化为该初始值.如果没有给出,则 ...
- java用一个方法对变量初始化_java中怎么给变量初始化?
展开全部 不同的变量初始化32313133353236313431303231363533e4b893e5b19e31333337613764方法不同. 变量包括:类的属性,或者叫值域 方法里的局部变 ...
- c++中结构体套结构体用 = {0}初始化编译报错解决办法(用memset或者={})(error: invalid conversion)
我这有个结构体: VENC_CHN_ATTR_S venc_chn_attr; /* the attribute of the venc chnl*/ typedef struct rkVENC_CH ...
最新文章
- list,set,map,数组间的相互转换
- IE8经常停止工作和显示异常
- 一生中用来开会的时间,你知道有多久吗?
- java oom_Java中关于OOM的场景及解决方法
- BZOJ5137lg4081(广义后缀自动机,set启发式合并)
- python编程游戏手机版_利用Python开发手机同款游戏:开心消消乐
- React + TypeScript 默认 Props 的处理
- 【Kafka】 kafka集群升级导致broker.id发生变动变动引起的问题
- 【风马一族_软件】微软卸载工具_msicuu2.exe
- openstack常见问题解决方法
- 计算机体系结构五大部分组成
- 距离向量算法与链路状态算法(RIP、OSPF)
- 虚拟机centOs Linux与Windows之间的文件传输
- 孤尽训练营打卡日记day17--面向对象
- adb logcat 命令
- 安全工具checksec.sh
- 《象与骑象人听书笔记》
- web无插件解码播放H264/H265(WebAssembly解码HTML5播放)
- 【数字信号处理及MATLAB实践】
- JDK17上手,新特性让你起飞