首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Golang使用New()返回结构指针,而不是直接创建结构指针

Golang使用New()函数返回结构指针,而不是直接创建结构指针的原因是为了方便内存管理和避免不必要的复制。下面是对这个问题的完善且全面的答案:

Golang是一种开源的编程语言,它具有简洁、高效、并发安全等特点,因此在云计算领域得到了广泛应用。在Golang中,使用New()函数可以动态地分配内存并返回一个指向新分配的零值结构的指针。

使用New()函数返回结构指针的优势在于:

  1. 内存管理:通过使用New()函数,可以避免手动分配和释放内存的麻烦。Golang的垃圾回收机制会自动处理不再使用的内存,减轻了开发人员的负担。
  2. 避免复制:当直接创建结构指针时,会发生一次结构体的复制操作。而使用New()函数返回结构指针,则可以避免这种不必要的复制,提高了程序的性能。

Golang中使用New()函数创建结构指针的示例代码如下:

代码语言:txt
复制
type Person struct {
    Name string
    Age  int
}

func main() {
    p := new(Person)
    p.Name = "John"
    p.Age = 30
    fmt.Println(p)
}

在上述示例中,通过调用new(Person)函数创建了一个指向Person结构的指针p,并对其成员进行赋值。最后,通过fmt.Println()函数打印出了结构指针p的值。

Golang中使用New()函数返回结构指针的应用场景包括但不限于:

  1. 创建动态数据结构:当需要在运行时动态创建数据结构时,可以使用New()函数返回结构指针。这样可以根据实际需求灵活地分配内存。
  2. 传递指针参数:在函数调用中,如果需要修改传入的结构体参数,可以使用New()函数返回结构指针,并将指针作为参数传递给函数。这样可以避免对结构体进行复制,提高了程序的效率。

腾讯云提供了丰富的云计算产品和服务,以下是一些与Golang开发相关的腾讯云产品和产品介绍链接地址:

  1. 云服务器(CVM):腾讯云提供的弹性计算服务,可满足各种规模的应用需求。产品介绍链接
  2. 云数据库MySQL版(CDB):腾讯云提供的高性能、可扩展的关系型数据库服务,适用于各种规模的应用。产品介绍链接
  3. 云存储(COS):腾讯云提供的安全、稳定、低成本的对象存储服务,适用于存储和处理各种类型的数据。产品介绍链接

请注意,以上链接仅供参考,具体的产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

GO语言初始化数据结构的方法你知道吗?

xdm 我是阿兵云原生 使用 golang 进行编码过程中,你们都是如何初始化数据结构的呢 GO 里面提供了 2 个关键字来进行初始化数据结构 new make 不过有时候我也会直接使用花括号的方式直接就初始化...: 自定义一个结构体,里面 2 个成员, age 和 name 使用 new 对 T 最初始化,返回一个结构体的指针 type T struct{ age int name string } func...返回的是一个指针,且这个指针指向的内存地址上对应的值是一个该类型的 零值 瞅一眼 new 源码说明 image-20211017150756595 golang 源码中说到, new 的第一个参数是...数据类型,不是一个值,并且 new返回值是一个根据参数类型分配零值内存的指针 因此,我们上面看到的 new 出来的数据结构,打印出来的数据都是对应类型的零值 make 和 new 的区别 最后再来梳理一下...make 和 new 的区别,加深印象 make 只能用来初始化内置数据类型 slice map chan new 可以分配任意类型的数据(包括自定义数据类型) make 返回的是引用,是 Type

44430
  • golang | Go语言入门教程——结构体初始化与继承

    今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分。 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么给结构体定义函数,还有函数接收者的使用。...new关键字 我们可以通过new关键字来创建一个结构体的实例,这种方法和其他语言比较类似,这样会得到一个空结构指针,当中所有的字段全部填充它类型对应的零值。...,new函数返回的是一个结构指针不是结构体的值。...一般我们很少用new关键字,而是直接通过结构体加花括号的方式来初始化。 结构体名称 相比于使用new关键字,我们更常用的是通过结构体名称加上花括号的方式来进行初始化。...所以创建一个结构指针可以这样: func main() { p := &Point{} fmt.Print(p) } golang当中取地址符和声明指针的关键字和C语言是一样的,对于熟悉C语言的同学来说

    1.5K20

    世界上最好的语言——Go

    字符串的字符可以直接使用索引获取,如 var s string = "abc" println(s[0])//字符a 使用len内置函数获取字符串长度 len(s) 字符串可以直接使用+拼接,返回一个新字符串...var a int = 1 var p * int = &a 与c++不同,golang中的结构指针和普通结构体变量,都是通过.运算符获得成员,所以指针变量使用起来与普通变量差别看起来不是很大,只是因为其代表的是指针的变量...比如 //创建一个长度为5的int slice var a []int = make([]int ,5,10) //与数组不同的是slice变量在赋值(函数传参等)时是引用赋值,不是复制 其中第三个参数是...,复制旧元素,即返回不是之前的地址,但是go会自动修改前面旧slice引用的地址为新地址,所以对旧slice使用不会有影响(旧变量也会引用到新地址) map golang中定义一个map格式为 var...,返回创建后的文件指针 TempDir 创建指定前缀名的临时目录,返回创建目录的路径 WriteFile 将字节slice写入文件 ReadFile 读一个文件,返回文件内容(字节slice) ReadDir

    87841

    Golang其他细节总结

    new 和 make 区别 参考博客作用变量类型不同:new 给 string, int, array 分配内存,make 给 slice, map, channel 分配内存;返回类型不一样:new返回指向变量的指针...,make返回变量本身;处理方式不同:new 分配的空间被置零。...,切片是引用类型(切片底层指向一个数组)Golang指针传递的优点通过引用类型来传递大的数据结构,可以避免数据结构被复制多次,减少内存的消耗和运行时间的开销。...当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,不是销毁线程 系统调用 hand off 机制:G进行系统调用阻塞时,线程释放绑定的 P,把 P 转移给其他空闲的线程执行设置P的数量,提高并行能力抢占式调度...golang pprof实用使用指南(使用 pprof 做性能调试)传参数组过大,导致内存占用过大切片截取引起子切片内存泄漏(解决:make 一个新的切片,把数据 copy 过来)Goroutine 阻塞无法退出

    26921

    Go 问答汇总篇 二

    golang 中时候用指针什么时候用普通对象? 其实就两点,一是如果数据结构比较大,建议采用指针,不会发生值拷贝。二是如果需要修改结构的话,必须用指针。...Golang中的make(T, args)为什么返回T不是*T? make 针对的是 Go 的引用类型,即 chan、slice 和 map, new 针对的指针。...引用类型为什么 make 不是返回指针呢?这样一说好像和上个问题有点类似了,当然因为引用并不存在值类型的那些问题。...golang 等值比较是不是直接比较地址呢? 首先要说 Go 的等值比较比较的是值,不是地址。...Golang中fmt.Println和直接println有什么区别? println 主要是 Go 自己使用,比如源码、标准库等, fmt 才是给 Go 开发人员使用的。

    54520

    Golang 语言中的非类型安全指针

    01 介绍 Golang 语言中的 unsafe 包中包含的操作会绕过 Golang 程序的类型安全检查,直接操作内存,从而达到提升性能的目的。...student := new(user) // user 结构体中的 name 字段是第一个字段,可以直接通过指针修改,不需要使用偏移 studentName := (*string)(unsafe.Pointer...(student)) *studentName = "lucy" // user 结构体中的 age 字段不是第一个字段,所以需要使用偏移才能找到 age 字段的内存地址,修改值 studentAge...new 函数定义了一个 *user 类型的指针变量 student,然后使用 unsafe.Pointer 将 *user 类型的指针变量 student 转换为 *string 类型的指针变量 studentName...因为 age 字段不是 user 结构体的第一个字段,所以需要先使用偏移量找到 age 字段的内存地址,具体操作步骤是:先将 student 指针变量通过 unsafe.Pointer 和 uintptr

    90220

    Golang面试题集锦

    数组大小是固定的,切片大小不是。在运行时可以动态地增加或减少切片的大小,但数组不可以。切片类似于链表,可以向切片push,pop数据,实现FIFO,LIFO。使用了内置的添加、复制功能对切片操作。...1、new 的作用是初始化一个指向类型的指针(*T) new函数是内建函数,函数定义:func new(Type) *Type 使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。...它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是*T)的一个初始化的(不是零值)的实例。 简单介绍下golang中make和new的区别?...new(T)是为一个T类型的新值分配空间,并将此空间初始化为T的零值,并返回这块内存空间的地址,也就是T类型的指针T,该指针指向T类型值占用的那块内存。...make(T,args)返回初始化之后T类型的值,且此新值并不是T类型的零值,也不是T类型的指针T,而是T类型值经过初始化之后的引用。

    2.2K20

    数据类型和表达式

    以下是一些关于Golang复合数据结构体(Struct)类型的一些例子 以下是一些使用 Golang 结构体的例子: package main import "fmt" // 定义一个表示人的结构体...需要注意的是,在 Golang 中相等和不等运算符是 == 和 != 不是 = 和 。 接下来我们展示了逻辑运算符的优先级,包括 && 和 ||。...x := 42 p1 = &x fmt.Println(*p1) // 输出:42 // 使用 new 函数创建指针对象 p2 := new(int) *p2...我们通过 & 运算符获取变量 x 的地址,并将其赋值给指针变量 p1。然后我们使用 * 运算符访问指针所指向的变量的值,并打印出来。 接着我们演示了如何使用 new 函数创建指针对象。...我们使用 new 函数创建了一个新的整数类型变量,并将其地址赋值给指针变量 p2。然后我们使用 * 运算符访问指针所指向的变量的值,并打印出来。 最后,我们演示了如何在函数中使用指针参数。

    15910

    Java与Go到底差别在哪,谁要被时代抛弃?

    函数可以脱离“类”存在,函数可以依赖于结构体来调用或者依赖于包名调用。Golang 中的结构体放弃了继承、实现等多态概念,结构体之间可使用组合来达到复用方法或者字段的效果。...() {   personPoint := new(User) // 通过new方法创建结构指针   person1 := User{} // 通过Person{}创建默认字段的结构体   person2...new方法创建结构指针   entity.Solve(userPoint) // 函数调用   userPoint.Solve() // 方法调用 } 1.5 值类型、引用类型以及指针 Java...Golang Golang 中存在显式的指针操作,但是 Golang指针不像C那么复杂,不能进行指针运算。...除赋值以外它们都可以当做引用类型来使用。因此当我们这样做时,可以直接使用变量本身不用指针。 slice 与数组的区别为是否有固定长度,slice无固定长度,数组有固定长度。

    1.1K90

    Golang与Java全方位对比总结

    函数可以脱离“类”存在,函数可以依赖于结构体来调用或者依赖于包名调用。Golang中的结构体放弃了继承、实现等多态概念,结构体之间可使用组合来达到复用方法或者字段的效果。...() { personPoint := new(User) // 通过new方法创建结构指针 person1 := User{} // 通过Person{}创建默认字段的结构体 person2...GolangGolang中存在显式的指针操作,但是Golang指针不像C那么复杂,不能进行指针运算;所有的基本类型都属于值类型,但是有几个类型比较特殊,表现出引用类型的特征,分别是slice、map...、channel、interface,除赋值以外它们都可以当做引用类型来使用,因此当我们这样做时,可以直接使用变量本身不用指针。...所有可能出现异常的方法或者代码直接把错误当作第二个响应值进行返回,程序中对返回值进行判断,非空则进行处理并且立即中断程序的执行。

    1.1K71

    Go 语言入门系列:指针的基本应用

    Golang 中具备丰富的数据类型,基本类型有整型、浮点数、布尔型、字符串型等,除此之外,还有切片、结构体、指针、通道、map、数组等其他类型。本文将会介绍 GO 语言中的指针基本概念与相关用法。...除了使用 & 对变量进行取址操作创建指针,还可以使用 new 函数直接分配内存,并返回指向内存的指针,此时内存中的值会被初始化为类型的默认值。...如下例子所示: str := new(string) *str = "Golang is Good!" 在上述代码中,通过 new 函数创建了一个 *string 指针,并通过指针对其进行赋值。...在 Golang 的 flag 包中,命令行参数一般以指针返回,下面我们演示一个读取命令行参数的例子,如下代码所示: package main import ( "flag" "fmt" )...flag.Parse() fmt.Printf("I am %v %v, and my id is %v\n", *surname, personalName, *id) } 在上述代码中可以看到,除了直接获取指针类型的返回结果

    55940

    也说说不知道的Golang中参数传递

    本文将从这三个内建结构展开,来介绍golang中参数传递的一些细节问题。 背景 首先,我们直接的来看一个简短的示例,下面几段代码的输出是什么呢?...当然不是,请再请看看下面的例子:当我们使用的参数不再是string,改为map类型传入时,输出结果又是什么呢?...我们发现,与map和channel不同的是,sclie的make函数返回的是一个内建结构体类型slice的对象,并非一个指针类型,其中内建slice的数据结构如下: type slice struct...: makeslice()出来的一定是个结构体对象,不是指针; 函数内外打印的slice地址一致; 函数体内对slice中元素的修改在函数外部生效了; 函数体内对slice进行append操作在外部没有生效...但是,这些修改得以实现的原因,是因为数据本身是个指针类型,不是因为golang采用了引用传递,注意二者的区别哦~

    1.8K91

    Golang指针与nil浅析

    Golang也提供了指针,但是go不能进行指针运算,因此相对于C也少了很多复杂度。私以为,go之所以提供指针,并不是为了让你更多和内存打交道,而是提供操作数据的基本桥梁。...我们已经了解,nil的值是不能直接赋值的,因此(*arrPot)[0] = 11直接赋值会抛错。 new 关键之函数 既然如此,我们可以使用new创建一块内存,并把内存地址给arrPot指针变量。...go会给引用类型初始化为nil,nil是不能直接赋值的。并且,map和数组指针还不一样,不能使用new开辟一个内存,然后再赋值。...new返回的是内存的地址,make则返回时类型的示例。比如new一个数组,则返回一个数组的内存地址,make一个数组,则返回一个初始化的数组。...方法中的指针 Go可以让我自定义类型,类型又可以创建方法。与OOP类似,方法接受一个类型的实例对象,称之为接受者,接受者既可以是类型的实例变量,也可以是类型的实例指针变量。

    1.2K70

    牛客网_Go语言相关练习_判断&选择题(6)

    主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用创建对象的语句中。...golang没有相关的构造函数定义,只能通过new创建构造函数。 ? Go语言中的map是无序的组合。 ?...序列化通常将类型结构传入标准库或第三方包,类型结构中没有大写的变量未导出,对第三方包不可见,无法进行任何操作,依旧是默认的零值。 ? 指针是引用类型。主要引用对方的地址。 ? 是目录名。 ?...Add函数带入的是b不是*b,所以只能在AC中选,但是i.(Integer)经过类型断言以后就是Integer类型了,无法自动转成*Integer,所以只能选A了。...Make只用来创建slice,map,channel,其中map使用前必须初始化。append可直接动态扩容slice,map不行。 map在使用前必须初始化。

    99410
    领券