目次
Go スライスのヘッダーを安全または安全に検査するにはどうすればよいですか?
Dec 18, 2024 am 01:16 AMスライス ヘッダーの検査
Go では、スライスは基になる配列への参照であり、そのヘッダーにはスライスの長さと容量に関する情報、およびスライスへのポインターが格納されます。基礎となるデータ。スライスの内容は変更できますが、通常、ヘッダーは同じままです。
次のコード スニペットを考えてみましょう。
var buffer [256] byte func SubtractOneFromLength(slice []byte) []byte { slice = slice[0 : len(slice)-1] return slice } func main() { slice := buffer[10:20] fmt.Println("Before: len(slice) =", len(slice)) newSlice := SubtractOneFromLength(slice) fmt.Println("After: len(slice) =", len(slice)) fmt.Println("After: len(newSlice) =", len(newSlice)) newSlice2 := SubtractOneFromLength(newSlice) fmt.Println("After: len(newSlice2) =", len(newSlice2)) }
ログイン後にコピー
関数 SubtractOneFromLength が呼び出されると、スライスが変更されますが、スライスヘッダーではありません。スライス ヘッダーを検査するには、reflect.SliceHeader 型を使用できます。
type SliceHeader struct { Data uintptr Len int Cap int }
ログイン後にコピー
次の安全でない操作は、スライス ポインターを *reflect.SliceHeader に変換する方法を示しています。
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
ログイン後にコピー
その後、フォーマット文字列 % v を使用してヘッダーの内容を出力できます:
fmt.Printf("%+v", sh)
ログイン後にコピー
The Go Playground は次の出力を生成します:
&{Data:1792106 Len:8 Cap:246}
ログイン後にコピー
この出力は、基礎となるデータのメモリ アドレス (Data)、スライスの長さ (Len)、およびその容量 (Cap) を提供します。
unsafe なし:
unsafe なしでスライスヘッダー情報にアクセスすることもできます。可能:
- データには &newSlice2[0] を使用
- len(newSlice2) for Len
- cap(newSlice2) for Cap
以上がGo スライスのヘッダーを安全または安全に検査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

人気の記事
2つのポイント博物館:バングルワシュタランドロケーションガイド
4週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌