Skip to content

0913new于make,以及指针与引用的区别

ziyouzy edited this page Sep 13, 2020 · 1 revision

总的来说,new比较简单,make比较复杂

new只是把内存空间置0,可以等同的理解成一个切片或者可变数组,初始化的时候里面还没有任何内容的,占用内存最低的状态

https://www.cnblogs.com/smartrui/p/12055399.html

new 分配返回的是指针,即类型 *Type。make 返回引用,即 Type这个似乎不用太去探明究竟

不过new的时候其实是创建了两个东西:

person1 := Person{"zhangsan","man",25} //创建一个person1对象 person2 := new(Person)//使用new创建一个person2对象,同时获得person的指针 person2.name,person2.sex,person2.age = "wangwu","man",25 person3 := &Person{"lisi","man",25}//使用&创建一个person3对象,同时获得person的指针

其实可以理解成这样:

i,err :=testyou()

同时创建了两个东西,一个实体,一个实体的指针,只不过只把实体的指针装进了一个新容器“person”

这篇文章不错:

https://www.cnblogs.com/oxspirt/p/10941480.html

如果这样就会变成了person里装的是值了:

person1 := Person{"zhangsan","man",25} //创建一个person1对象 fmt.Printf("person1:%v\n",person1) demo(&person1) fmt.Printf("person1:%v\n",person1)

实体和指针都有容器装着他们,值是person(与之前的是不同的,值钱的person2和3里装得是指针),而指针的容器是函数demo()的参数表

目前看来这些都是一些常规操作,但是这些常规操作之前并不能分清到底是属于指针的知识点范畴,还是引用的知识点范畴

搞明白了,其实是这样的,引用类型只是一种名词,如果他有什么内涵的知识点的话其实真没有,唯一的只是他和值类型是对应关系。

所以在这里总结一下吧,值类型和引用类型其实在概念上更接近于设计类型,如单例模式,设计者模式,装饰者模式啥的。

值类型就是一个变量包含一个变量名和其所对应的值,值的生命周期是其所在的作用域决定的,同时也会分配给这个值储存内容所必须的内存块

引用类型则表面上看起来拥有两个用来储存内容的"容器":

首先他也会创建某个变量,只给这个变量分配储存内容所必须的内存块,并没有变量名

既然有了变量值,那就可以拿到他的指针(int a;p := &a)

于是起一个变量名,用来储存他的指针

现在在来解释下变量名,或许这一切的思路就会变得更加清晰了:

说白了,变量名是给编译器看的,在把程序编译成机器语言或者是可执行文件时,他并不属于整体体系的一部分。

把复杂的东西简单化,用一句话概括,把变量名当作语法糖就行了。

总结:

实例化任何一个东西的本质都是开辟一块内存空间,为了实现某种功能,或储存某种数值

其实真正的变量名,就是只向这个内存空间的内存地址,这才是唯一重要的,是哈希关系。

变量名只不过是编程软件为了让程序员方便使用,从而设计出的一种功能

只不过所有的开发软件给内存地址起别名都是必备的技能,所以才让程序员认为他是语言本身的一种技术

严格来说他是语言本身的一种技术,但是有人会去在意语法糖是开发软件的功劳还是语言自身的功劳吗?

最后再通俗的梳理一下:

值类型数据的变量名是这个值所在内存块指针的别名

引用类型数据的变量名是一个指针变量所在内存块的别名,这个指针变量储存了这个值所在内存块的内存地址

所以你看,后者还是存在着两个容器,只不过他是个类似链表的结构,所以只有一个容器有名字

下一篇文章探讨下c++的引用类型与go语言引用类型之间的区别

Clone this wiki locally