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

golang | 是返回struct还是返回struct的指针

当我们定义一个函数时,是返回结构体呢,还是返回指向结构体的指针呢? 对于这个问题,我想大部分人的回答,肯定都是返回指针,因为这样可以避免结构体的拷贝,使代码的效率更高,性能更好。 但真的是这样吗?...上图中,函数f返回的是结构体S的指针,即一个地址,这个可以通过其汇编来确认: ? 看上图中的选中行。 第一行是调用函数f,其结果,即结构体S的指针,或结构体S的地址,是放到ax寄存器中返回的。...第二行用0x8(ax),即ax中的地址加8的形式,来获得结构体S中a2字段的值,然后将该值和0x2相比,以进行后续逻辑。 由此可见,返回结构体指针的形式,确实是只传递了一个地址。...有关go内存是在堆上分配的,还是在栈上分配的,这个是在编译过程中,通过逃逸分析来确定的,其主体思想是: 假设有变量v,及指向v的指针p,如果p的生命周期大于v的生命周期,则v的内存要在堆上分配。...看上图,f1函数中的&S{...}逃逸到了堆上,即是在堆上分配的。 以上是对80字节大小的结构体,返回指针和返回值情况的比较,那如果结构体字节数更小或更大会怎么样呢?

4K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python中struct.pack()和struct.unpack()用法

    python中的struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~。...注1.q和Q只在机器支持64位操作时有意思 注2.每个格式前可以有一个数字,表示个数 注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串 注4.P用来转换一个指针...,其长度和机器字长相关 注5.最后一个可以用来表示指针类型的,占4个字节 为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换...i 代表C struct中的int类型,故而本机占4位,1则表示为01000000; h 代表C struct中的short类型,占2位,故表示为0200; 同理b 代表C struct中的signed...比如刚才的小程序的后半部分,使用的format string中首位为!

    16.3K102

    详说C#中的结构struct

    2、结构中的字段不能赋初始值。 3、无参数的构造函数无论如何C#编译器都会自动生成,所以不能为结构定义一个无参构造函数。 4、在构造函数中,必须给结构体的所有字段赋值。...5、在构造函数中,为属性赋值,不认为是对字段赋值,因为属性不一定是去操作字段。 6、结构是值类型,在传递结构变量的时候,会将结构对象里的每一个字段复制一份拷贝到新的结构变量的字段中。...7、不能定义自动属性,因为字段属性会生成一个字段,而这个字段必须要求在构造函数中,但我们不知道这个字段叫什么名字。...9、栈的访问速度快,但空间小,堆的访问速度慢,但空间大,当我们要表示一个轻量级的对象的时候,就定义为结构,以提高速度,根据传至的影响来选择,希望传引用,则定义为类,传拷贝,则定义为结构。...二、Demo 1 struct Point 2 { 3 public Program p; 4 private int x; 5 6

    67051

    python3中的struct模块使用

    软硬件环境 python3 struct 简介 struct是python(包括版本2和3)中的内建模块,它用来在c语言中的结构体与python中的字符串之间进行转换,数据一般来自文件或者网络。...常用方法 struct模块中的函数 函数 return explain pack(fmt,v1,v2…) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. pack_into...struct.unpack(fmt,string) 按照给定数据格式解开(通常都是由struct.pack进行打包)数据,返回值是一个tuple 对齐方式 为了同c中的结构体交换数据,还要考虑c或c...++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下 Character Byte order Size...本例来实现往一个2进制文件中按照某种特定格式写入数据,之后再将它读出。相信通过这个理例子,你就能基本掌握struct的使用。

    2.1K20

    Go中struct初始化内存布局情况

    结构体 在Go中,struct可以理解为是一种封装数据类型,其内部可以是函数、变量、接口等等任何类型,struct也是一种值类型数据。今天分享struct不同方式的初始化,内存有什么不同。...初始化 struct初始化可以有三种方式,分别是var声明、new声明和直接初始化。 var声明 使用var,和声明普通变量的方式一致。...package main import ( "fmt" "unsafe" ) type Student struct { name string age uint } func main...var声明 使用var声明时,会直接在内存中开辟一块空间,来存储结构体的初始值。大致的内存布局结构如下: 默认情况下,会根据字段的数据类型,进行值初始化(零值)。...new初始化 使用new初始化时,会返回该结构体的指针,该指针指向的是结构体的零值。如果初始化了值,对应字段的值会进行值初始化。

    50430

    swift 中类(class)和结构体(struct)区别

    类(class) 引用类型:将一个对象赋值给另一个对象时,系统不会对此对象进行拷贝,而会将指向这个对象的指针赋值给另一个对象,当修改其中一个对象的值时,另一个对象的值会随之改变。...结构体(struct) 值类型:将一个对象赋值给另一个对象时,会对此对象进行拷贝,复制出一份副本给另一个对象,在修改其中一个对象的值时,不影响另外一个对象。...不同点:1.类属于引用类型,结构体属于值类型 2.类允许被继承,结构体不允许被继承 3.类中的每一个成员变量都必须被初始化,否则编译器会报错,而结构体不需要,编译器会自动帮我们生成init函数,给变量赋一个默认值...举个例子: import UIKit struct StructName { var name:String?

    1.1K20

    Go Struct function “指针接收者” 与 “值接收者” 区别

    type person struct { // 定义结构体 name string weight int}// 指针接收者func (p *person) get_name...由于值接收者通过数据拷贝方式传递,因此在方法中修改结构体成员值不会改变结构体成员的原有值。无论结构体方法是指针接收者还是值接收者,结构体方法的调用方式都是一样的。...示例以下是一个对比 “值接收者” 和 “指针接收者” 区别的例子:struct_function_receiver.gopackage mainimport "fmt"type person struct...这种方式不改变 Source Struct 中的属性数据,那么应用场景只能是获取 Source Struct 中的数据,然后通过计算获取一个 return 值,供调用方使用,才有使用价值了。...Java 中函数方式的入参使用的是对象引用,这个对象引用就是 Go 里的 “指针接收者”。两种方式在使用时,语法上没有什么区别,都是 structName.methodName 。

    18310

    C# 中 Struct 和 Class 的区别总结

    结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型的对象。 比较 结构体和类共享许多特性,但与类相比有以下局限性。...结构体可以用作 nullable type(即:Nullable 中的 T),对其赋值 null 值,参考【Nullable Struct (https://docs.microsoft.com...序号 结构体(struct) 类(class) 1 结构体是值类型,可以在栈(stack)上分配,也可以在包含类型中内联分配。 类是引用类型,在堆(heap)上分配并垃圾回收。...在类中,两个变量可以包含同一对象的引用,对一个变量的任何操作都会影响另一个变量。...但是在类中,输出将是 100,因为变量 “a” 和 “b” 引用同一个对象。

    1.3K20

    C#中的元组(Tuple)和结构体(struct)

    在正常的函数调用中,一个函数只能返回一个类型的值,但在某些特殊情况下,我们可能需要一个方法返回多个类型的值,除了通过ref,out或者泛型集合可以实现这种需求外,今天,讲一下元组和结构体在这一方面的应用...那如何去获取元组中的值呢?...很简单,使用元组名.Item1-7 int a = tuple.Item1; string b = tuple.Item2; 元组中的元素也是可以自定义名称的 var tup = (name:...returnTuple(); Console.WriteLine(result.Item1); Console.WriteLine(result.Item2); 运行结果如下: 结构体 结构体(struct...)也是值类型的,它的声明就像类一样,只不过关键字是struct 下面来看一下它的声明: struct MyStruct { public int id;

    89320
    领券