golang 内置函数new 和struct 初始化的区别在go语言中 new()这是一个用来分配内存go语言初始化方式的内置函数go语言初始化方式,它go语言初始化方式的第一个参数是一个类型,不是一个值 , 它的返回值是一个指向新分配的 t 类型的零值的指针 。
在golang的代码定义如下go语言初始化方式: func new(t Type) *Typestrut{}直接使用struct{} 来初始化strut时,返回的是一个struct类型的值,而不是指针两者是不一样的 两者对比代码如下:
type Student struct{id intname string }func main(){var s_1 *Student = new(Student)s_1.id = 100s_1.name = "cat"
var s_2 Student = Student{id:1,name:"tom"}fmt.Println(s_1,s_2) }输出结果:
{100 cat} {1 tom} 从上面代码的声明和打印的结果中就可以看出 s_1 的类型为指针,s_2 为一个Student类型
Go语言中new和 make的区别详解new 主要用于结构体go语言初始化方式的初始化
make用于数组arraygo语言初始化方式,切片slice , 协程chnnelgo语言初始化方式的初始化
例如go语言初始化方式:users:=make([10]int);
msg:=make(chan int);
new会分配结构空间,并初始化为清空为零,不进一步初始化
new之后需要一个指针来指向这个结构
make会分配结构空间及其附属空间,并完成其间的指针初始化
make返回这个结构空间,不另外分配一个指针
例子new:
var p *[]int = new([]int)
或
p := new([]int)
以上分配go语言初始化方式了一个slice结构,但是结构中的应该指向底层数组的ptr指针为空,故实际不能往这个slice里面存取数据
同时分配了一个指针p,也即(在32位系统中)占4个字节并存放slice结构的地址
例子make:
var v []int = make([]int, 0)
v := make([]int, 0)
以上分配了一个slice结构,且结构中的应该指向底层数组的ptr指针已经指向了某个底层数组,这个底层数组应该已经分配了,故这个slice已经可以使用了
注意v就是这个slice结构,而不是一个指向slice的指针
上述仅是示例,一般使用时都会明确长度和容量:v := make([]int, 10, 50)
结论:
由上可见 , 用new来分配slice的意义不大,因为没有恰当的初始化,无法直接使用
有附带空间的结构 , 使用make来初始化,可以完成内部指针初始化,其后可以立即使用
Go语言和其他语言的不同之基本语法Go语言作为出现比较晚的一门编程语言,在其原生支持高并发、云原生等领域的优秀表现,像目前比较流行的容器编排技术Kubernetes、容器技术Docker都是用Go语言写的,像Java等其他面向对象的语言 , 虽然也能做云原生相关的开发,但是支持的程度远没有Go语言高,凭借其语言特性和简单的编程方式,弥补了其他编程语言一定程度上的不足 , 一度成为一个热门的编程语言 。
最近在学习Go语言,我之前使用过C#、Java等面向对象编程的语言,发现其中有很多的编程方式和其他语言有区别的地方 , 好记性不如烂笔头,总结一下 , 和其他语言做个对比 。这里只总结差异的地方,具体的语法不做详细的介绍 。
种一棵树最好的时间是十年前,其次是现在 。
3)变量初始化时候可以和其他语言一样直接在变量后面加等号,等号后面为要初始化的值 , 也可以使用变量名:=变量值的简单方式
3)变量赋值 Go语言的变量赋值和多数语言一致 , 但是Go语言提供了多重赋值的功能,比如下面这个交换i、j变量的语句:
在不支持多重赋值的语言中,交换两个变量的值需要引入一个中间变量:
4)匿名变量
推荐阅读
- 华为提醒更新鸿蒙系统,华为提醒系统更新怎么办
- 硬盘接口没有电怎么办,硬盘电源接口不够
- flutter架构建设,flutter模块化构建
- erp系统运营工作总结,erp系统运行情况报告
- 函数减法C语言 c语言中减法函数
- java代码实体映射优化,java对象映射工具
- 卡哇伊休闲游戏手机版,卡哇伊游戏推荐
- 电脑睡眠虚拟机还运行吗,虚拟机已休眠
- asp.net数据增删改查,netbeans数据库增删改查