Go でメモリセーフなコードを記述することは、プログラムのクラッシュ、データの破損、セキュリティの脆弱性を防ぐために重要です。実践方法としては、ポインタの受け渡し、スライス容量の使用、バッファ オーバーフローの回避、慎重にスライスを使用すること、make() を使用してスライスとマップを作成すること、defer を使用してリソースを解放すること、sync.Mutex を使用して同時アクセスを同期することなどが挙げられます。これらのプラクティスに従うと、コードの堅牢性と信頼性が向上し、実際のケースに反映される可能性があります。
Go でメモリセーフなコードを記述することは、プログラムのクラッシュ、データ破損、セキュリティの脆弱性を防ぐために重要です。次の実践に従うと、コードの堅牢性と信頼性を向上させることができます。
値 (T
) の代わりにポインター (*T
) を渡すことで、渡された値が誤って変更されるのを防ぎます。 。例:
func Swap(a, b *int) { *a, *b = *b, *a }
スライス ([]T
) は基礎となる配列に基づいているため、その容量を理解することが重要です。容量はアレイの最大長を表します。容量を超えると、Go はより大きな基本配列を自動的に割り当て、スライスのアドレスを変更します。
次のコードは、これを示しています。
s := []int{1, 2, 3} println(len(s), cap(s)) // 3 3 s = append(s, 4) println(len(s), cap(s)) // 4 6
関数:
copy() コピーされたデータの量がターゲット バッファの容量を超えないようにします。
s1 := []int{1, 2, 3} s2 := s1[1:] s1[0] = 4 println(s1) // [4 2 3] println(s2) // [2 3]
make()defer
を使用してリソースを解放します。
defer
ステートメントは、関数が戻る前にコードのブロックが実行されるようにします。これは、開いているファイルやネットワーク接続などのリソースを解放するのに役立ちます。 次の例では、defer
を使用してファイルを閉じます:
func main() { file, err := os.Open("file.txt") if err != nil { return } defer file.Close() // 执行其他操作 }
Using sync.Mutex
sync。 Mutex
は、共有リソースへの同時アクセスを同期するために使用されるミューテックス ロックです。 Lock()
メソッドと Unlock()
メソッドを使用してロックを取得および解放できます。 次の例では、
sync.Mutex
を使用して、共有データへの同時アクセスを保護します。
var mu sync.Mutex var count int func main() { for i := 0; i < 10; i++ { go func() { mu.Lock() defer mu.Unlock() count++ }() } // 等待所有协程完成 }
実用的なケース次の交差を計算する計算を考えてみましょう。 2 つのスライス 関数:
func Intersection(s1, s2 []int) []int { var res []int for _, v1 := range s1 { for _, v2 := range s2 { if v1 == v2 { res = append(res, v1) } } } return res }
make()
を使用します。 最終的に改善されたコードは次のとおりです:
func Intersection(s1, s2 []int) []int { res := make([]int, 0, min(len(s1), len(s2))) for _, v1 := range s1 { for _, v2 := range s2 { if v1 == v2 { copy(res[len(res):], []int{v1}) } } } return res }
以上がGolang 関数のメモリ安全プログラミングの実践の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。