ホームページ > バックエンド開発 > Golang > スライスの長さが容量を超えると Go がランタイム エラーをスローするのはなぜですか?

スライスの長さが容量を超えると Go がランタイム エラーをスローするのはなぜですか?

Barbara Streisand
リリース: 2024-10-29 17:26:02
オリジナル
394 人が閲覧しました

 Why Does Go Throw a Runtime Error When a Slice's Length Exceeds its Capacity?

スライスについて: 容量と長さ

Go でスライスを扱う場合、容量と長さの関係を理解することが重要です。容量はスライスが動作する基になる配列のサイズを指し、長さはスライス内に現在含まれている要素の数を指定します。

実行時エラー: スライスの長さが容量を超えています

長さよりも小さい容量のスライスを作成しようとすると、「実行時エラー:makeslice:cap out of range」というエラーが発生します。このエラーは、スライスが設計上、長さが容量を超えることのない不変式を維持するために発生します:

0 ≤ len(s) ≤ cap(s)
ログイン後にコピー

コード例では:

type b []int
var k = make([]b, 10, 5)
fmt.Println(k[8])
ログイン後にコピー

型のスライス k を定義しました。 []b、ここで b は別のスライス タイプです。ただし、このスライスを容量 5 で作成しようとしましたが、長さ 10 に対応するには不十分です。そのため、実行時エラーが発生します。

Why Not a Compile-Timeエラー?

場合によっては、容量と長さの値が静的な場合、コンパイラがコンパイル時にエラーを検出する可能性があります。ただし、これは常に実現できるわけではありません。次のコードを考えてみましょう:

package main

import (
    "fmt"
    "rand"
)

func main() {
    k := make([]int, rand.Int(), rand.Int())
    fmt.Println(k)
}
ログイン後にコピー

ここで、容量と長さの値は、rand パッケージを使用して実行時に動的に決定されます。そのため、コンパイラーは、容量が常に長さを超えるかどうかを静的に検証することができないため、このチェックをランタイムに委任する必要があります。

以上がスライスの長さが容量を超えると Go がランタイム エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート