」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼在 Go 切片中出現切片邊界超出範圍錯誤?

為什麼在 Go 切片中出現切片邊界超出範圍錯誤?

發佈於2024-12-21
瀏覽:278

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

切片:Go 中的越界錯誤

在 Go 中,切片涉及提取現有切片的一部分以創建新切片片。當切片過程中出現越界錯誤時,表示指定範圍超出了來源切片的有效索引邊界。

考慮以下程式碼片段:

a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[1:]
printSlice("c", c)

func main() {

a := make([]int, 5) 列印切片(“a”,a) b := make([]int, 0, 5) 列印切片(“b”,b) c := b[1:] printSlice("c", c)

fmt.Printf("%s len=%d cap=%d %v\n",
    s, len(x), cap(x), x)

func printSlice(s string, x []int) {

fmt.Printf("%s len=%d上限=%d %v\n", s, len(x), cap(x), x)

}
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
panic: runtime error: slice bounds out of range

goroutine 1 [running]:
main.main()
   /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10  0x150

運行此程式碼會導致越界錯誤:

a len =5 cap=5 [0 0 0 0 0] b 長度=0 上限=5 [] 恐慌:運行時錯誤:切片邊界超出範圍 Goroutine 1 [運行]: main.main() /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 0x150要理解為什麼會出現這個錯誤,我們需要深入研究 Go 中的切片規則。

切片規則
  • 對切片或陣列進行切片時,指定的索引可以是顯式的,也可以是隱式的。如果未明確提供索引,則它預設為特定值。對於切片:
  • 缺少下限預設為 0。
缺少上限預設為

len(slice)

(不是 cap(slice))。
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
panic: runtime error: slice bounds out of range

goroutine 1 [running]:
main.main()
   /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10  0x150

在給定的程式碼中,發生錯誤是因為創建c 切片的切片表達式is:c := b[1:]

這意味著明確指定了下限(1),但未明確指定上限。因此,它預設為 len(b),即 0。但是,指定的下限 (1) 必須

小於或等於
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]

要避免此錯誤,可以明確指定下限和上限。例如,要從b 切片中僅提取第二個元素,您可以編寫:

c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]

或者,如果要從第二個元素開始提取整個b 切片,可以使用:Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]

最新教學 更多>
  • 如何使用 PHP 有效率地檢索 MySQL 表的行數?
    如何使用 PHP 有效率地檢索 MySQL 表的行數?
    如何使用PHP 程式檢索MySQL 表中的行數您尋求確定MySQL 表中的總行數並儲存它在變數$ count 中。您最初的嘗試產生了單字“Array”。 解決方案涉及利用 mysqli_fetch_assoc($result) 來檢索計數值。以下是三種方法:使用列別名:$sql = "SE...
    程式設計 發佈於2024-12-21
  • 如何在 Python 中將代理對轉換為普通字串?
    如何在 Python 中將代理對轉換為普通字串?
    Converting Surrogate Pairs to Normal String in PythonThis question尋求一種將包含代理對的Python Unicode字串轉換為標準字元串的方法表示。目標是獲得可理解的 Unicode 字元或標準化的十六進位格式。 提供的程式碼片段提供...
    程式設計 發佈於2024-12-21
  • 為什麼 HTTP POST 請求會錯過 Go 中的上下文取消訊號?
    為什麼 HTTP POST 請求會錯過 Go 中的上下文取消訊號?
    帶Body 的HTTP 請求中上下文取消信號丟失在Go 中開發HTTP 伺服器時,出現了一個問題: context.Done ( ) 頻道無法捕捉帶有正文的請求的客戶端斷開連接訊號。此行為與 GET 請求不同,後者成功偵測到客戶端離開。 根本原因這種不一致源自於 net/http 伺服器的功能。它的...
    程式設計 發佈於2024-12-21
  • 禁止更改原始程式碼時如何使用 Servlet 過濾器修改請求參數?
    禁止更改原始程式碼時如何使用 Servlet 過濾器修改請求參數?
    使用Servlet Filter修改請求參數使用Servlet Filter修改請求參數在現有的Web應用程式中,您面臨XSS漏洞,並被禁止修改原始碼。為了解決這個問題,您打算利用 servlet 過濾器在請求參數到達易受攻擊的頁面之前對其進行清理。 import java.io.*; import...
    程式設計 發佈於2024-12-21
  • 如何安全地將單引號插入MySQL資料庫?
    如何安全地將單引號插入MySQL資料庫?
    避免 MySQL 中的單引號陷阱將包含單引號或雙引號的值插入 MySQL 資料庫時,可能會因語法衝突而出現困難。要解決此問題並確保資料完整性,正確轉義這些字元至關重要。 轉義單引號要插入包含單引號的值,您可以使用以下方法之一: 雙引號: SELECT 'This is Ashok''s Pen.';...
    程式設計 發佈於2024-12-21
  • 如何在SQL Server 2012中實作MySQL的SUBSTRING_INDEX功能?
    如何在SQL Server 2012中實作MySQL的SUBSTRING_INDEX功能?
    MySQL 中substring_index 函數的SQL Server 等效項MySQL 中的substring_index 函數用於從給定字串之前的指定字元串中提取子字串分隔符號出現的次數。若要在 SQL Server 2012 中實作類似的功能,您可以採用下列方法之一:T-SQL 標量函數:C...
    程式設計 發佈於2024-12-21
  • 為什麼在 Java 中不應該使用 == 來比較浮點數?
    為什麼在 Java 中不應該使用 == 來比較浮點數?
    問題:在Java 中使用== 進行浮點比較的陷阱儘管它在Java 中作為浮點數的相等運算符存在, == 在比較浮點數時存在局限性,靜態分析警告(例如“JAVA0078浮點數值與==.答案:精度問題浮點數儲存為近似值,運算過程中可能會出現捨入誤差。比較兩個浮點數可能會產生誤報或誤報。測試它們之間的絕對...
    程式設計 發佈於2024-12-21
  • 如何使用「filter_var()」在 PHP 中驗證 URL 以及何時應考慮正規表示式?
    如何使用「filter_var()」在 PHP 中驗證 URL 以及何時應考慮正規表示式?
    URL 的PHP 驗證/正規表示式如果您需要一個簡單的方法來驗證PHP 中的URL,您可以使用filter_var() 函數。這個多功能函數可以確定給定的字串是否符合有效的URL: ]預設情況下,filter_var() 採用基本的URL 過濾機制,可能不適合更複雜的驗證要求。如果您發現自己處於這種...
    程式設計 發佈於2024-12-21
  • C++ 物件實例化:堆疊與堆疊:「new」還是不是「new」?
    C++ 物件實例化:堆疊與堆疊:「new」還是不是「new」?
    實例化物件:有或沒有New在C中建立物件時,程式設計師可以使用「new」運算子或直接實例化它們沒有它。雖然這兩種方法都創建對象,但它們在幾個關鍵方面有所不同。 不帶 New實例化一個不帶「new」的物件會直接在目前作用域中為其保留記憶體。這通常在堆疊上完成,並產生具有自動生命週期的物件。物件在其定義...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中停用魔術引號並處理反斜線插入問題?
    如何在 PHP 中停用魔術引號並處理反斜線插入問題?
    「每個引號前都有斜線」Enigma您在PHP 腳本中遇到了一個特殊問題:每當表單提交給自身時對於包含雙引號的值,它會在每個值之前加上一個反斜線。此行為歸因於 PHP 臭名昭著的「魔術引號」功能。 魔術引號會自動轉義某些字元(包括雙引號),以防止惡意注入。雖然這看起來像是一種安全措施,但它也可能導致與...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 中以字元數組形式存取原始向量資料?
    如何在 C++ 中以字元數組形式存取原始向量資料?
    以 Char 陣列形式存取原始向量資料考慮需要在函數中使用 std::vector 作為 char 陣列需要一個空指標。最初,使用常規字元數組很簡單。然而,切換到 std::vector 的靈活性在存取其原始資料方面提出了挑戰。 將向量指標傳遞給函數立即嘗試將向量&something 或其迭代器&s...
    程式設計 發佈於2024-12-21
  • MySQL設定檔中的「init_connect」和「init-connect」有什麼差別?
    MySQL設定檔中的「init_connect」和「init-connect」有什麼差別?
    了解MySQL 設定檔部分MySQL 設定檔(my.ini) 提供多個部分,每個部分針對MySQL 操作的特定方面進行客製化。讓我們深入研究這些部分並闡明「init_connect」和「init-connect」之間的差異:my.ini 文件的可選部分: [mysql]:設定mysql命令列客戶端,...
    程式設計 發佈於2024-12-21
  • 為什麼在 C++ 向量中使用迭代器時我的距離計算會關閉?
    為什麼在 C++ 向量中使用迭代器時我的距離計算會關閉?
    在C 向量中使用迭代器:已解決的常見陷阱迭代器對於遍歷和操作C 向量中的元素至關重要。然而,如果使用不當,它們可能會導致意想不到的結果。在本文中,我們將探討向量運算中迭代器的常見問題,並提供解決方案來解決這個問題。 在提供的程式碼片段中,嘗試計算儲存在向量中的點之間的距離。由於迭代器的使用不正確,預...
    程式設計 發佈於2024-12-21
  • IllegalArgumentException 或 NullPointerException:Setter 方法中空參數的哪一個例外?
    IllegalArgumentException 或 NullPointerException:Setter 方法中空參數的哪一個例外?
    何時為空參數拋出IllegalArgumentException 或NullPointerException定義setter 方法時,開發人員經常面臨是否拋出IllegalArgumentException 的困境或定義setter 方法時,開發人員經常面臨是否拋出IllegalArgumentEx...
    程式設計 發佈於2024-12-21
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-21

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

Copyright© 2022 湘ICP备2022001581号-3