自定义一个结构体

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方法)相关推荐

  1. go结构体初始化_golang中结构体的初始化方法

    目录 1.自定义一个结构体 type Vertex struct { X, Y float64 } 2.初始化方法-指针: rect1 := new(Vertex ) rect2 := &Ve ...

  2. go结构体初始化_golang中结构体的初始化方法(new方法) | 学习笔记

    自定义一个结构体 1 2 3 4type Rect struct { x, y float64 width, height float64 } 初始化方法: 1 2 3 4rect1 :=new(Re ...

  3. golang 结构体断言_Golang中的reflect原理

    反射(reflect)是在计算机程序运行时,访问,检查,修改它自身的一种能力,是元编程的一种形式.在Java等语言中都很好地支持了反射.Golang也实现了反射,主要核心位于reflect包,官方文档 ...

  4. java发送c语言结构体_C语言中结构体直接赋值?

    在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...

  5. C语言结构体与C++中结构体和类的区别

    在C++中除了类中可以有构造函数和析构函数外,结构体中也可以包含构造函数和析构函数,这是因为结构体和类基本雷同,唯一区别是,类中成员变量默认为私有,而结构体中则为公有.注意,C++中的结构体是可以有析 ...

  6. c 结构体转byte_C中结构体和字节流的互换及内存对齐

    mystruct p; char buff[50]; memcpy(buff,&p,sizeof(p)); //把p的内容以字节形式拷贝到buff中 mystruct* q; q = (mys ...

  7. java为什么要初始化_JAVA中到底要怎么样初始化

    Java中的变量作用范围: 1. 类的属性,或者叫值域 2. 方法里的局部变量 3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化.如果给出了初始值,则初始化为该初始值.如果没有给出,则 ...

  8. java用一个方法对变量初始化_java中怎么给变量初始化?

    展开全部 不同的变量初始化32313133353236313431303231363533e4b893e5b19e31333337613764方法不同. 变量包括:类的属性,或者叫值域 方法里的局部变 ...

  9. c++中结构体套结构体用 = {0}初始化编译报错解决办法(用memset或者={})(error: invalid conversion)

    我这有个结构体: VENC_CHN_ATTR_S venc_chn_attr; /* the attribute of the venc chnl*/ typedef struct rkVENC_CH ...

最新文章

  1. list,set,map,数组间的相互转换
  2. IE8经常停止工作和显示异常
  3. 一生中用来开会的时间,你知道有多久吗?
  4. java oom_Java中关于OOM的场景及解决方法
  5. BZOJ5137lg4081(广义后缀自动机,set启发式合并)
  6. python编程游戏手机版_利用Python开发手机同款游戏:开心消消乐
  7. React + TypeScript 默认 Props 的处理
  8. 【Kafka】 kafka集群升级导致broker.id发生变动变动引起的问题
  9. 【风马一族_软件】微软卸载工具_msicuu2.exe
  10. openstack常见问题解决方法
  11. 计算机体系结构五大部分组成
  12. 距离向量算法与链路状态算法(RIP、OSPF)
  13. 虚拟机centOs Linux与Windows之间的文件传输
  14. 孤尽训练营打卡日记day17--面向对象
  15. adb logcat 命令
  16. 安全工具checksec.sh
  17. 《象与骑象人听书笔记》
  18. web无插件解码播放H264/H265(WebAssembly解码HTML5播放)
  19. 【数字信号处理及MATLAB实践】
  20. JDK17上手,新特性让你起飞

热门文章

  1. leetcode 429 层序遍历n叉树(C语言)
  2. C/C++ Native 包大小测量
  3. Nodejs 安装 on centos7
  4. Delphi 10.2.3发布
  5. JS String 对象 常用方法
  6. 用CSV文件读写数据的两种方式(转)
  7. Chrome截图扩展程序-“截图快手”
  8. proc文件系统面面谈(转贴)
  9. 未能找到服务器的主机名,未能找到服务器的主机名
  10. 第四篇:稳定性之提升团队潜意识【及时止损、监控报警】