亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號