第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 golang 中的包之間傳遞映射

在 golang 中的包之間傳遞映射

Go
弒天下 2023-01-03 17:07:18
在golang中,我知道m(xù)ap函數(shù)之間是以引用的形式傳遞的,但是今天遇到了一個(gè)奇怪的情況。代碼的運(yùn)行結(jié)果不是我想象的那樣。我將其簡(jiǎn)化為以下代碼行。.├── go.mod├── main.go├── packageA│   └── a.go└── packageB    └── b.gomain.go 文件package mainimport (    "gostudy/packageA"    "gostudy/packageB")func main() {    packageB.UseMap(packageA.M, packageA.InitMap)}前package packageAvar M map[string]stringfunc InitMap() {    M = make(map[string]string)    M["hello"] = "go"}b.gopackage packageBimport "fmt"func UseMap(m map[string]string, callback func()) {    callback()    fmt.Println(m)}可以看到,a.go文件中只有一個(gè)全局聲明的變量。我以為上面的程序應(yīng)該輸出map[hello:go],但它實(shí)際上輸出了一個(gè)空的map[]。我對(duì)此很困惑,希望得到答案。
查看完整描述

2 回答

?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊

在調(diào)用函數(shù)以將其替換為地圖的新版本之前,您將地圖的舊值作為參數(shù)傳遞。


假設(shè)packageA.M包含值map[string]string{"foo": "bar"}。該main()函數(shù)讀取變量并獲取對(duì)該映射的引用,并將它和函數(shù)傳遞給packageB.UseMap().


在 內(nèi)部packageB.UseMap(),您的代碼packageA.InitMap()通過(guò)回調(diào)進(jìn)行調(diào)用。這不會(huì)修改現(xiàn)有地圖;相反,它會(huì)創(chuàng)建一個(gè)新地圖,將其分配給全局變量并填充它。任何擁有舊地圖副本的東西都不會(huì)受到影響,并且您顯示的代碼不會(huì)重新讀取packageA.M.


我建議完全放棄全局變量:它會(huì)使代碼難以測(cè)試,并且一旦開(kāi)始使用 goroutines 就會(huì)出現(xiàn)潛在問(wèn)題。只需讓您的設(shè)置函數(shù)返回新地圖即可。


package packageA


func InitMap() map[string]string {

        return map[string]string{"hello": "go"}

}

package packageB


func UseMap(callback func() map[string]string) {

        m := callback()

        fmt.Println(m)

}

package main


import "packageA"

import "packageB"


func main() {

        packageB.UseMap(packageA.InitMap)

}


查看完整回答
反對(duì) 回復(fù) 2023-01-03
?
喵喵時(shí)光機(jī)

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊

就像已接受的答案的旁注一樣,如果您看一下:



// ...

import (

    "reflect"

    "fmt"

)


// ... other functions

// I defined all of the functions in a single paackage, so I can access them both here

func UseMap(m map[string]string, callback func()) {

    fmt.Println(reflect.ValueOf(m).Pointer() == reflect.ValueOf(M).Pointer()) // prints true, they have the same reference

    callback() 

    // inside callback, M global variable takes a whole new reference

    // when "M = make(...)"

    // and then => 

    fmt.Println(reflect.ValueOf(m).Pointer() == reflect.ValueOf(M).Pointer()) // prints false

}


如果你想在不改變你的 api 的情況下避免這種情況,你可以在你的包 A 中這樣做:


package packageA


var M map[string]string = make(map[string]string)


func InitMap() {

    M["hello"] = "go"

}


查看完整回答
反對(duì) 回復(fù) 2023-01-03
  • 2 回答
  • 0 關(guān)注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)