美文网首页
Golang time.Time应该使用值传递还是指针引用传递

Golang time.Time应该使用值传递还是指针引用传递

作者: ShootHzj | 来源:发表于2021-06-21 12:22 被阅读0次

TLTR

大部分场景应该使用值传递。

正文

Go 的文档指出

Programs using times should typically store and pass them as values, not pointers. That is, time variables and struct fields should be of type time.Time, not *time.Time. A Time value can be used by multiple goroutines simultaneously.

翻译一下就是

程序使用times典型场景应该把它们当做值传递,而非指针。也就是说time变量及结构体field应该为time.Time,而不是*time.Time。Time值是协程安全的。之所以说typically,是因为有着那么不typically的场景,比如你想在方法内修改原来的time.Time对象这种场景(很少见)。

time.Time是一个较小的对象,把它作为值传递是完全合理的。传递指针而不是值的很重要的一个原因是避免昂贵的拷贝动作。但是传递指针也会给gc带来一些额外的开销,如逃逸分析等。

值得一提的是,你可以通过go build -gcflags="-m"来判断变量在堆中还是在栈中。

image-20210621112238335

time.Time在我的MBP上只有24个字节。附上几个简单类型的字节数

byte size is  1
int32 size is  4
int size is  8
int64 size is  8
float32 size is  4
float64 size is  8
time size is  24

测试程序

package demo_base

import (
    "fmt"
    "testing"
    "time"
    "unsafe"
)

func TestSize(t *testing.T) {
    {
        var x byte = 0
        fmt.Println("byte size is ", unsafe.Sizeof(x))
    }
    {
        var x int32 = 0
        fmt.Println("int32 size is ", unsafe.Sizeof(x))
    }
    {
        var x int = 0
        fmt.Println("int size is ", unsafe.Sizeof(x))
    }
    {
        var x int64 = 0
        fmt.Println("int64 size is ", unsafe.Sizeof(x))
    }
    {
        var x float32 = 0
        fmt.Println("float32 size is ", unsafe.Sizeof(x))
    }
    {
        var x float64 = 0
        fmt.Println("float64 size is ", unsafe.Sizeof(x))
    }
    {
        t := time.Now()
        fmt.Println("time size is ", unsafe.Sizeof(t))
    }
}

相关文章

  • Golang time.Time应该使用值传递还是指针引用传递

    TLTR 大部分场景应该使用值传递。 正文 Go 的文档指出 翻译一下就是 程序使用times典型场景应该把它们当...

  • 后端研发体系

    记录自己为了面试发现的文章 golang golang中都是值传递,没有引用传递,哪怕是指针,也是指针的值拷贝。 ...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • Go语言学习笔记(三)

    指针 Go的指针不能运算 参数传递 Go的参数传递是值传递(值传递:开辟新的空间,拷贝传递参数的值,引用传递:引用...

  • 读书笔记17.06.02【stack】【vector】

    C++中参数传递:按值传递,指针传递和引用传递按值传递:形参是实参的拷贝。指针传递:拷贝指针,被调用函数对指针指向...

  • golang学习笔记(七)复合类型

    复合类型 类型名称作为函数参数pointer指针值传递array数组值传递slice切片引用传递map字典引用传递...

  • golang值传递、指针传递

    函数参数传递过程中,数组是值传递的,切片是指针传递。 直接上代码:

  • 自整理3 值传递和引用传递

    java的值传递和引用传递 首先,由于java没有指针机制,所有java归根究底只有值传递,没有引用传递。java...

  • 王道程序员求职宝典(十)函数,栈与队列

    函数 参数传递值传递指针传递引用传递指针引用*& 内联函数成员函数内联普通函数内联宏定义 默认参数从右向左设定默认...

  • c++重要的概念部分

    1. const 修饰指针 2.指针和数组 3.值传递和地址传递(相当于java的引用传递) 值传递:特点 不改...

网友评论

      本文标题:Golang time.Time应该使用值传递还是指针引用传递

      本文链接:https://www.haomeiwen.com/subject/cvlyyltx.html