为了账号安全,请及时绑定邮箱和手机立即绑定

C++ 中的常量引用和 Golang 中的等价物

C++ 中的常量引用和 Golang 中的等价物

Go
饮歌长啸 2022-01-04 10:48:05
我是从 C++ 世界和 C++ 开始的,通常当您关心性能并且不需要更改对象时,您可以使用常量引用传递它void func(const std::string& str)在这种情况下,字符串未复制且无法在函数中修改。我知道,在 Go 中有两种传递对象的方法:按值,然后你不能修改(或者实际上你可以但没有意义)它,但它非常消耗内存通过指针,这从内存方面来说是好的,但是您可以修改对象。那么,最好的方法是什么?即使您不想修改它,也总是通过指针传递对象,因为它更快?或者有一些编译器优化,即使您按值发送它有时也会作为参考发送?
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

Go 中没有直接的等价物。

  1. 如果对象很大(大于 32-64 字节)和/或需要更改,则通过指针传递。

  2. 如果上述规则不适用,则按值传递。

  3. 映射/通道/切片是引用类型,它们包含内部指针,因此您不需要通过指针传递它们,除非您计划可能传递 nil 或想要附加(不修改已包含的元素)到切片。

例子:

func doMap(m *map[string]string) {

    if *m == nil {

        *m = map[string]string{}

    }

    .....

}


查看完整回答
反对 回复 2022-01-04
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

对于可以*string用作参数的字符串,您似乎无法更改原始字符串:


package main


import (

    "fmt"

    )


func t1(s *string) {

    fmt.Println("Inside before: %s", *s)

    s2 := "tEsT1"

    s = &s2

    fmt.Println("Inside after 1: %s", *s)

}


func main() {

    var s = "test"

    fmt.Println("Ourside before: %v", s)

    t1(&s)

    fmt.Println("Ourside  after: %v", s)

}

印刷:


Ourside before: %v test

Inside before: %s test

Inside after 1: %s tEsT1

Ourside  after: %v test

对于复杂的结构,通过引用和阻止编辑将更困难或不可能。


如果我弄错了,请纠正我(我只是在学习 Go)。


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号