」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > ## 為什麼我不能在 Go 中只複製帶有指標接收器的類型實例?

## 為什麼我不能在 Go 中只複製帶有指標接收器的類型實例?

發佈於2024-11-08
瀏覽:409

## Why Can\'t I Just Copy Instances of Types With Pointer Receivers in Go?

了解指標接收器和複製實例

在 Go 中,可以使用值接收器或指標接收器來定義方法。當類型 T 的所有方法都有 T 本身的接收者類型時,複製該類型的實例是安全的,因為呼叫其任何方法都必然會進行複製。

然而,當類型有帶有指標接收器的方法。在這種情況下,應避免複製該類型的實例,因為它可能違反內部不變量。

複製指標的問題

讓我們考慮一個範例來說明問題。假設我們有一個有兩個欄位的類型 Wrapper:值 v 和指標 p。我們打算在 v 和 p 的指向值中儲存相同的數字。為了確保這一點,我們提供了一個帶有指標接收器的 Set 方法:

type Wrapper struct {
    v int
    p *int
}

func (w *Wrapper) Set(v int) {
    w.v = v
    *w.p = v
}

如果我們有Wrapper實例並且呼叫Set方法,它將修改p的指向值。但是,如果我們建立實例的副本,則副本將與原始實例共用相同的指標值 p。這意味著對任一實例的任何後續方法呼叫都會影響兩個副本。

範例:

a := Wrapper{v: 0, p: new(int)}
b := a

fmt.Printf("a.v=%d, a.p=%d;  b.v=%d, b.p=%d\n", a.v, *a.p, b.v, *b.p)

a.Set(1)
fmt.Printf("a.v=%d, a.p=%d;  b.v=%d, b.p=%d\n", a.v, *a.p, b.v, *b.p)

輸出:

a.v=0, a.p=0;  b.v=0, b.p=0
a.v=1, a.p=1;  b.v=0, b.p=1

在此範例中,呼叫 a.Set(1) 後,b 的值無效,因為 b.v 不等於 *b.p。這是因為 a 和 b 中的指標 p 都指向相同的基礎值。

為了避免此類問題,建議在使用帶有指標接收器的方法時使用指標值。或者,如果該類型只能具有值接收器,則無論方法呼叫如何,複製該類型的實例都是安全的。

最新教學 更多>
  • 如何將逗號分隔的字串轉換為 Python 清單?
    如何將逗號分隔的字串轉換為 Python 清單?
    將逗號分隔的字串轉換為 Python 清單給定一個包含一系列逗號分隔值的字串,最好將其轉換為 Python 清單。此轉換有助於進一步的數據分析和操作。 要實現此目的,請利用 str.split 方法:my_string = 'A,B,C,D,E' my_list = my_string.split(...
    程式設計 發佈於2024-11-09
  • 如何在 Node.js 中使用 Promises 非同步處理 MySQL 回傳值?
    如何在 Node.js 中使用 Promises 非同步處理 MySQL 回傳值?
    在Node.js 中利用Promise 處理MySQL 回傳值從Python 過渡到Node.js,Node.js 的非同步特性使得Node.js 的非同步特性變得更加重要。 Node.js 可能會帶來挑戰。考慮一個場景,您需要從 MySQL 函數傳回一個值,例如 getLastRecord(nam...
    程式設計 發佈於2024-11-09
  • 模糊匹配與三元組搜尋:在 Node.js 和 MySQL 中建立智慧搜尋
    模糊匹配與三元組搜尋:在 Node.js 和 MySQL 中建立智慧搜尋
    介紹 在現代應用程式中,高效的文字搜尋至關重要,尤其是在處理大型資料庫時。雖然 MySQL 提供了基本的全文搜尋功能,但在模糊匹配或處理拼字錯誤方面卻存在不足。這就是基於三元組的搜尋發揮作用的地方。在這篇部落格中,我們將探討什麼是三元組、它如何提高搜尋效能以及如何在 MySQL 中實現三元組搜尋。 ...
    程式設計 發佈於2024-11-09
  • 如何在銳利邊緣的影像縮放中停用抗鋸齒?
    如何在銳利邊緣的影像縮放中停用抗鋸齒?
    在影像縮放中停用抗鋸齒當影像在縮放時出現模糊或插值時,就會出現在影像縮放期間停用抗鋸齒的挑戰。出現這種情況是因為瀏覽器應用抗鋸齒技術來平滑影像邊緣,從而產生柔和的外觀。 值得慶幸的是,CSS 提供了一系列可以有效禁用抗鋸齒的標誌。然而,儘管有建議的標誌,例如 image-rendering: -mo...
    程式設計 發佈於2024-11-09
  • 在 Windows 上使用 WSL2 將 Polars 與 NVIDIA GPU (CUDA) 結合使用
    在 Windows 上使用 WSL2 將 Polars 與 NVIDIA GPU (CUDA) 結合使用
    首先,如果我錯過了什麼,或者出了什麼問題,請告訴我,或者如果您有疑問 步驟 WSL2 透過 Window 商店安裝任何 Linux 發行版(例如 Ubuntu 22.04) 啟動並建立使用者 透過在命令提示字元或 Powershell(在 Windows 裝置上)中執...
    程式設計 發佈於2024-11-09
  • 如何在 Go 中安全存取巢狀 JSON 陣列?
    如何在 Go 中安全存取巢狀 JSON 陣列?
    破解 Go 中的 JSON 陣列存取問題在 Go 中處理 JSON 回應時,存取嵌套陣列中的元素可能會帶來挑戰。在嘗試檢索特定資料點時,經常會出現「類型介面 {} 不支援索引」之類的錯誤。 要解決此問題,了解 Go 中 JSON 回應的基本性質至關重要。預設情況下,陣列表示為 []interface...
    程式設計 發佈於2024-11-09
  • 量子計算:它將如何重新定義技術
    量子計算:它將如何重新定義技術
    量子计算代表了 21 世纪最深刻的技术进步之一。与使用位来处理 0 或 1 信息的经典计算机不同,量子计算机使用可以同时存在于多种状态的量子位或量子位。计算领域的这一根本性转变有望重新定义技术,推动各个领域的突破并解决目前经典系统难以解决的问题。 在本文中,我们将探讨量子计算的工作原理、其潜在应用以...
    程式設計 發佈於2024-11-09
  • Set Composition 讓您的生活更輕鬆
    Set Composition 讓您的生活更輕鬆
    最後!當 Set 過去被引入時,它已經讓我們的生活變得更好了。我們能夠輕鬆產生獨特的列表,而且在尋找和設定這些列表上的項目方面也具有更好的效能。 這很棒,但我們仍然缺少其他語言所擁有的一些東西。這是真的,因為我們就是這樣。隨著 2024 年 Set 中加入新的組合方法,我們最終將能夠透過簡單的呼叫...
    程式設計 發佈於2024-11-09
  • 過去的爆炸:使用 Python 建立您自己的太空入侵者遊戲 - 逐步教程
    過去的爆炸:使用 Python 建立您自己的太空入侵者遊戲 - 逐步教程
    設定您的開發環境 在使用 Python 編寫 Space Invaders 之前,請確保您的開發環境設定正確。您需要在電腦上安裝 Python。建議使用 Python 3.8 或更高版本,以更好地相容於庫。此外,安裝 Pygame,它是一組專為編寫視訊遊戲而設計的 Python 模...
    程式設計 發佈於2024-11-09
  • SQL Server 中的日期時間和時間戳記有什麼不同?
    SQL Server 中的日期時間和時間戳記有什麼不同?
    了解SQL Server 中日期時間和時間戳記之間的差異雖然SQL Server 中的日期時間和時間戳記資料型別都處理日期和時間,但它們表現出根本的區別。 Datetime 是專為儲存日期和時間資訊而設計的資料類型。它支援多種格式和日期/時間計算。另一方面,Timestamp 並不是用來儲存日期和時...
    程式設計 發佈於2024-11-09
  • 如何在Python中尋找清單中的元素數量(列表長度)?
    如何在Python中尋找清單中的元素數量(列表長度)?
    在Python中查找列表中的元素數量(列表長度)在Python中,確定列表中的元素數量,也稱為列表長度,是一個常見的操作。為了實現這一點,我們可以利用 len() 函數。 例如,考慮列表 items = ["apple", "orange", "ba...
    程式設計 發佈於2024-11-09
  • 快速 HTML - ** 伺服器錯誤 NotFoundError:需要 k**
    快速 HTML - ** 伺服器錯誤 NotFoundError:需要 k**
    快速 HTML - 500 伺服器錯誤 NotFoundError:需要 2 pk 如果有人在使用快速 HTML 時遇到此問題,他們試圖從具有多個主鍵的表中獲取行並獲得需要 2 PK 或需要兩個主鍵的一些變化 問題 500 伺服器錯誤 NotFoundError: ...
    程式設計 發佈於2024-11-09
  • 如何有效率地檢索MySQL中最後插入的行?
    如何有效率地檢索MySQL中最後插入的行?
    檢索 MySQL 中最後插入的行:高效方法高效檢索 MySQL 中最後插入的行是資料庫程式設計中的常見任務。以下是實現此目的的兩種有效方法:1。時間戳列:理想的解決方案是建立一個 TIMESTAMP 列,在行插入時自動捕獲當前時間戳記。這提供了一種可靠且準確的方法來確定最近的記錄。 2。 ORDER...
    程式設計 發佈於2024-11-09
  • 在 Python 中處理 CSV 檔案時如何跳過標頭?
    在 Python 中處理 CSV 檔案時如何跳過標頭?
    使用Python 處理CSV 檔案時跳過標頭處理包含標頭的CSV(逗號分隔值)檔案時,通常需要在處理過程中排除這些標頭。本文解決了嘗試在 Python 中跳過標題時遇到的常見問題。 提供的程式碼片段遇到標題行受應用函數影響的問題。要修正此問題,讀者應注意 reader 變數會迭代 CSV 檔案中的行...
    程式設計 發佈於2024-11-09
  • 如何使用 PHP 中的 CURL 檢索 SSL 憑證資訊
    如何使用 PHP 中的 CURL 檢索 SSL 憑證資訊
    如何在PHP 中使用CURL 獲取SSL 證書信息在PHP 中使用SSL 證書時,通常需要訪問有關證書的信息,例如發行人、主題和到期日期。 Stream_context_create() 函數可用來建立指定要使用的 SSL 憑證的流上下文。然後可以使用stream_context_get_param...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3