メインパッケージ / * 書式#include <stdlib.h>に含まれ * / インポート"C" のインポート( "安全でない" "FMT" ) タイプstruct {スライス データunsafe.Pointer //ユニバーサルポインタ型が対応するC言語のvoid *型 のlen // int型有効長 キャップINT //有効キャパシタンス } CONST = TAG 8 / * FUNCメイン(){ スライスの//定義 // 1、データメモリアドレス2,3のLEN有効データ長、24ワードの拡張可能なキャップの有効容量セクション VAR S [] INT //unsafe.Sizeofメモリバイトサイズで計算データ型を占め fmt.Println(unsafe.Sizeof(S)) } * / / * FUNCメイン(){ IインターフェースVAR} { I = // ==!= 10ののみをサポート @型アサーションは、データ変換インターフェースの種類に基づいています //value,ok:=i.(int) {//もしOK // fmt.Println( "整数データ:"、値) // fmt.Printf( "%T \ N-"、値) //} //は、界面反射のデータ・タイプを取得 //t:=reflect.TypeOfを( I) //fmt.Println(t) //データインターフェイス型反射値取得 Vを:= reflect.ValueOf(I) fmt.Println(V) I1 = 10 I2 = 20である IF reflect.Typeof(I1)= reflect.Typeof =(I2){ V1:= reflect.Valueof(I1) :V2 = reflect.Valueof(I2)は、 V1 + V2 =もたらす } } * / //(容量データ長)を作成 FUNC(S *スライス)を作成します(L int型、C INTは、データをint型...){ //データが空で返した場合 IF LEN(データ)== 0 { リターン } //長さ0の長さ未満0質量データ長以上の容量より大きい未満であり L IF <C 0 || <|| L 0> C || LEN(データ)> L { リターン } // ULONGLONGロングロング符号なしlong整数符号なし データC言語コードを格納するための//オープンスペースを //場合をヒープ空間オープン故障の戻り値は、空間の等価メモリアドレス番号0ナシNULLである s.Data = C.malloc(* C.ulonglong(C)。8) s.len = Lは s.cap = C //に変換することができます。算出ポインタ型 P:= UIntPtr(s.Data) _、V用:データ範囲= { //データストレージ *(INT *)(unsafe.Pointer(P))= V //オフセットポインタ P + = TAG //p+=unsafe.Sizeof(1) } } //プリントスライス印刷 FUNC(S *スライス)を印刷(){ IF S ==ゼロ{ リターン } //ユニバーサルポインタに変わりは、ポインタを算出することができる :P = uintptrを(s.Data) Iの場合:= 0; I <s.len; I ++ { //データメモリを取得 ( ""、*(int型*)(unsafe.Pointer(P)))fmt.Printを Pは、タグ+ = } } //アペンドスライス FUNC(S *スライス)追加(データを... INT){ IF S ==ゼロ{ リターン } lenのIF(データ)== 0 { リターン } //追加データは、容量超える場合 IF s.len + LEN(データ)> s.cap { //容量拡張を / /C.realloc(ポインタのバイトサイズ)、2倍の拡張囲碁言語。 = C.realloc s.Data(s.Data、C.ulonglong(s.cap)* 2 * 8) //容量変化値 s.cap s.cap * = 2 } P = UIntPtr(s.Data) 私は:= 0;私は<s.len I ++ { //オフセットポインタ P + = TAG } //データを追加 =レンジデータ:_、Vために { *(INT *)(unsafe.Pointer(P))を= V タグ+ = P } //更新有効なデータ(長さ) s.len s.len + = LEN(データ) } // GetDataの要素(添字)を取得します。戻り値の要素のint funcを(S *スライス)GetdData(インデックスint型){int型 IF == S ==ゼロゼロ|| s.Data { 戻り0 } IFインデックス<0 ||インデックス> 1-s.len { 戻り0 } P = UIntPtr(s.Data) iについて:= 0; I <インデックス、I ++ { Pタグを= + } リターン*(INT *)(unsafe.Pointer(P)) } //要素が検索見つける(要素)添字のintの値を返し FUNC(S *スライス)を検索( int型データ){int型 IF == S ==ゼロゼロ|| s.Data { リターン-1 } P = UIntPtr(s.Data) Iの場合:= 0;私は<s.len; I ++ { //戻されたデータの最初の要素の位置が表示された検索 IF *(INT *)(unsafe.Pointer(P)){データ== リターンI } //ポインタオフセット P = TAGの+ } リターン-1 } //削除要素(添字)を削除 FUNC(S *スライス)を削除(INTインデックス){ IF == S ==ゼロゼロ|| s.Data { リターン } 指数IF 。<0 ||インデックス> 1-s.len { リターン } 割出し位置除去する必要の//ポインタ = UIntPtr(s.Data):Pの iについて:= 0; I <インデックス、I ++ { P = TAGの+ } //次の割り当てに対応するポインタに対応するポインタ値の現在の値を用いて行わ TEMP:= P Iのための:=指数; I <s.len; I ++ { TEMP + = TAG *(INT *)(unsafe.Pointer(P))* =(INT *)(unsafe.Pointer(TEMP)) P = TAG + } s.len-- } //インサート要素を挿入(添字要素) FUNC(スライス* S)インサート(INTインデックス、データをINT){ IF == S ==ゼロゼロ|| s.Data { リターン } インデックス<0 ||インデックス> 1-s.len {IF リターン } //データが挿入されている場合最後 //インデックス== s.len-IFを1 { // P:= UIntPtr(s.Data) // // // Iのための:= 0; I <s.len; I ++ { // // TAG + = P //} // // + = P * UIntPtr TAG(-s.len。1) // *(INT *)(unsafe.Pointer(P))データ= // s.len ++ //リターン / /} // appendメソッド呼び出し ならインデックス== s.len-1 { s.Append(データ) のリターン } //データ挿入位置取得 = UIntPtr(s.Data):Pの iについて:= 0; I <インデックス、I ++ { P = TAGの+を } 端の位置へのポインタを取得// TEMP = UIntPtr(s.Data) TEMP * = UIntPtr TAG +(s.len) //順次後退データの背後にある iについて:= s.len; I>索引; i-- { //データ割当と、現在のデータの前に *(* INT) (unsafe.Pointer(TEMP))* =(INT *)(unsafe.Pointer(TEMP - TAG)) TEMP - TAG = } //変更されたデータの添え字を挿入 *(* INT)(unsafe.Pointer( P))= データ s.len ++ } //破壊スライス FUNC(S *スライス)(破壊){ // C言語の適切な放出ヒープ領域呼び出し C.free(s.Data)を s.Data =ゼロ s.len = 0 s.cap = 0 S =ニル }