ホームページ  >  記事  >  バックエンド開発  >  golangのスライスとは何ですか

golangのスライスとは何ですか

青灯夜游
青灯夜游オリジナル
2022-11-24 19:36:302304ブラウズ

golang では、スライスは配列の連続したフラグメントへの参照です。このフラグメントは、配列全体、または開始インデックスと終了インデックスによって識別されるいくつかの項目のサブセットにすることができます。 Go 言語のスライスの内部構造には、アドレス、サイズ、容量が含まれます。スライスは通常、データ セットをすばやく操作するために使用されます。データ セットをケーキのカットにたとえると、スライスは必要な「部分」です。プロセスには、どこから開始するか (スライスの開始位置)、どのくらいの大きさにカットするか (スライスのサイズ) が含まれます。容量は、スライスを保持するポケットのサイズとして理解できます。

golangのスライスとは何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

スライスは配列の連続フラグメントへの参照であるため、スライスは参照型です (つまり、C/C の配列型、または Python のリスト型に似ています)。これは配列全体であるか、開始インデックスと終了インデックスによって識別される一部の項目のサブセットである可能性があります。終了インデックスによって識別される項目はスライスに含まれないことに注意してください。

Go 言語のスライスの内部構造には、アドレス、サイズ、容量が含まれます。スライスは通常、データ セットをすばやく操作するために使用されます。データ セットをケーキのカットにたとえると、スライスは「ピース」です。切断プロセスには、どこから開始するか (スライスの開始位置)、およびどのくらいの大きさに切断するか (スライスのサイズ) が含まれます。容量は、図に示すように、スライスを保持するポケットのサイズとして理解できます。下の図のとおりです。

golangのスライスとは何ですか#図: スライスの構造とメモリ割り当て

配列またはスライスからの新しいスライスの生成

#スライスはデフォルトで連続メモリ領域を指します。これは配列またはスライス自体にすることができます。

連続メモリ領域からスライスを生成するのは一般的な操作です。形式は次のとおりです:

slice [开始位置 : 结束位置]

構文は次のとおりです:

  • slice : ターゲット スライス オブジェクトを表します;

  • 開始位置: ターゲット スライス オブジェクトのインデックスに対応します;

  • 終了位置: に対応しますターゲットスライスの終了インデックス。

配列からスライスを生成します。コードは次のとおりです。

var a  = [3]int{1, 2, 3}
fmt.Println(a, a[1:2])

ここで、 a は 3 つの整数要素を含む配列で、値 1 ~ 3 に初期化されます。 [1:2] を使用すると、新しいスライスを生成できます。コードの実行結果は次のとおりです。

[1 2 3]  [2]

ここで、[2] は [1:2] スライス操作の結果です。

配列またはスライスからの新しいスライスの生成には、次の特徴があります:

  • 取り出される要素の数: 終了位置 - 開始位置;

  • 取り出した要素には終了位置に相当するインデックスが含まれていないため、スライスの最後の要素をslice[len(slice)];で取得します

  • デフォルトの開始位置を使用する場合は、連続した領域の先頭から開始位置から開始することを意味します;

  • デフォルトの終了位置を使用する場合は、領域の先頭から終了位置までを意味します開始位置から連続領域全体の終端まで;

  • 両方同時に デフォルトでは、スライス自体と同等です; 両方の場合

  • が 0 の場合、空のスライスに相当し、通常はスライスのリセットに使用されます。

スライス要素の値をインデックス位置に応じて取得する場合、値の範囲は(0~len(slice)-1)となり、これを超えると実行時エラーとなります。スライスが生成されると、位置に len(slice) を入力できますが、エラーは報告されません。 [関連する推奨事項:

Go ビデオ チュートリアル ]

例を通してスライスの特徴を理解しましょう。

1) 指定された範囲からスライスを生成します

スライスと配列は分離できません。配列をオフィスビルとして理解する場合、スライスとは連続する異なるフロアを分離することです。 . ユーザーにレンタルします。レンタル プロセスでは、開始フロアと終了フロアを選択する必要があります。このプロセスではスライスが生成されます。サンプル コードは次のとおりです:

var highRiseBuilding [30]int
for i := 0; i < 30; i++ {
        highRiseBuilding[i] = i + 1
}
// 区间
fmt.Println(highRiseBuilding[10:15])
// 中间到尾部的所有元素
fmt.Println(highRiseBuilding[20:])
// 开头到中间指定位置的所有元素
fmt.Println(highRiseBuilding[:2])

コード出力は次のとおりです:

golangのスライスとは何ですか

コードでは 30 階建ての高層ビルが建設されています。配列の要素値の範囲は 1 から 30 で、異なる独立したフロアを表します。出力結果は賃貸と販売が異なります。予定。

コードの説明は次のとおりです。

  • 8 行目、インターバル フロアをレンタルしてみます。

  • 11号線、20階以上の賃貸物件。

  • 14 号線、2 階以下の賃貸、通常は商業店舗です。

スライスは C 言語のポインタに似ています。ポインタは演算を実行できますが、メモリ演算が範囲外になるという代償が伴います。スライスはポインタに基づいてサイズを増加させ、メモリを制限しますスライスに対応する領域。スライスを使用する場合、スライス内のアドレスとサイズは手動で調整できないため、スライスはポインタよりも安全で強力です。

2) 元のスライスを表します

スライスを生成する形式では、開始位置と終了位置が無視されると、生成されたスライスは元のスライスと同じになります。スライス スライス、生成されたスライスのデータ内容は元のスライスと一致します。コードは次のとおりです:

a := []int{1, 2, 3}
fmt.Println(a[:])

a 是一个拥有 3 个元素的切片,将 a 切片使用 a[:] 进行操作后,得到的切片与 a 切片一致,代码输出如下:

golangのスライスとは何ですか

3) 重置切片,清空拥有的元素

把切片的开始和结束位置都设为 0 时,生成的切片将变空,代码如下:

a := []int{1, 2, 3}
fmt.Println(a[0:0])

代码输出如下:

golangのスライスとは何ですか

直接声明新的切片

除了可以从原有的数组或者切片中生成切片外,也可以声明一个新的切片,每一种类型都可以拥有其切片类型,表示多个相同类型元素的连续集合,因此切片类型也可以被声明,切片类型声明格式如下:

var name []Type

其中 name 表示切片的变量名,Type 表示切片对应的元素类型。

下面代码展示了切片声明的使用过程:

// 声明字符串切片
var strList []string
// 声明整型切片
var numList []int
// 声明一个空切片
var numListEmpty = []int{}
// 输出3个切片
fmt.Println(strList, numList, numListEmpty)
// 输出3个切片大小
fmt.Println(len(strList), len(numList), len(numListEmpty))
// 切片判定空的结果
fmt.Println(strList == nil)
fmt.Println(numList == nil)
fmt.Println(numListEmpty == nil)

代码输出结果:

golangのスライスとは何ですか

代码说明如下:

  • 第 2 行,声明一个字符串切片,切片中拥有多个字符串。

  • 第 5 行,声明一个整型切片,切片中拥有多个整型数值。

  • 第 8 行,将 numListEmpty 声明为一个整型切片,本来会在{}中填充切片的初始化元素,这里没有填充,所以切片是空的,但是此时的 numListEmpty 已经被分配了内存,只是还没有元素。

  • 第 11 行,切片均没有任何元素,3 个切片输出元素内容均为空。

  • 第 14 行,没有对切片进行任何操作,strList 和 numList 没有指向任何数组或者其他切片。

  • 第 17 行和第 18 行,声明但未使用的切片的默认值是 nil,strList 和 numList 也是 nil,所以和 nil 比较的结果是 true。

  • 第 19 行,numListEmpty 已经被分配到了内存,但没有元素,因此和 nil 比较时是 false。

切片是动态结构,只能与 nil 判定相等,不能互相判定相等。声明新的切片后,可以使用 append() 函数向切片中添加元素。

使用 make() 函数构造切片

如果需要动态地创建一个切片,可以使用 make() 内建函数,格式如下:

make( []Type, size, cap )

其中 Type 是指切片的元素类型,size 指的是为这个类型分配多少个元素,cap 为预分配的元素数量,这个值设定后不影响 size,只是能提前分配空间,降低多次分配空间造成的性能问题。

示例如下:

a := make([]int, 2)
b := make([]int, 2, 10)

fmt.Println(a, b)
fmt.Println(len(a), len(b))

代码输出如下:

golangのスライスとは何ですか

其中 a 和 b 均是预分配 2 个元素的切片,只是 b 的内部存储空间已经分配了 10 个,但实际使用了 2 个元素。

容量不会影响当前的元素个数,因此 a 和 b 取 len 都是 2。

温馨提示

使用 make() 函数生成的切片一定发生了内存分配操作,但给定开始与结束位置(包括切片复位)的切片只是将新的切片结构指向已经分配好的内存区域,设定开始与结束位置,不会发生内存分配操作。

更多编程相关知识,请访问:编程视频!!

以上がgolangのスライスとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。