ホームページ  >  記事  >  バックエンド開発  >  Go の「copy」関数は重複するスライスに対してどのように機能しますか?

Go の「copy」関数は重複するスライスに対してどのように機能しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 03:44:31444ブラウズ

How does the Go `copy` function work with overlapping slices?

コピー関数の詳細を理解する

Go プログラミング言語には、あるスライスから別のスライスへの要素のコピーを容易にする組み込みのコピー関数が用意されています。ドキュメントによると、コピーはソース スライスから宛先スライスに要素をコピーすることによって動作します。特に、宛先がバイトのスライスである場合、ソースは文字列にすることができます。

関数の署名と動作

コピー関数の署名は次のとおりです。

<code class="go">func copy(dst, src []Type) int</code>

ここで、dst と src はそれぞれ宛先スライスとソース スライスを表します。戻り値は、コピーされた要素の数を示す整数で、両方のスライスの長さの最小値です。

要素のコピー

コピーの仕組みを説明するために、次の例を考えてみましょう。

<code class="go">src := []int{10, 11, 12, 13, 14}
dst := []int{0, 1, 2, 3, 4}

n := copy(dst, src)
fmt.Println("n =", n, "src =", src, "dst =", dst)</code>

出力:

n = 5 src = [10 11 12 13 14] dst = [10 11 12 13 14]

この例では、ソース スライスの 5 つの要素すべてが宛先スライスにコピーされ、宛先スライスにはソース スライスと同じ要素が含まれます。 .

スライスが重なったコピー

コピーの興味深い機能は、スライスの重複を処理できることです。オーバーラップとは、宛先スライスとソース スライスが同じ基礎となる配列を共有するシナリオを指します。このような場合でも、次の例に示すように、関数を正しくコピーします。

<code class="go">copy(src, src[1:])
fmt.Println("n =", n, "src =", src)</code>

出力:

n = 4 src = [1 2 3 4 4]

この例では、src[1:] がソースとして使用されます。 、最初の要素を除きます。ソースには 4 つの要素があるため、4 つの要素がコピーされ、要素が 1 つのインデックスだけシフトされました。

文字列の特殊なケース

コピー関数では、文字列からバイトをコピーすることもできます。バイトのスライス。次のコードはこれを示しています。

<code class="go">str := "Hello, World!"
data := make([]byte, 5)
n = copy(data, str)
fmt.Println("n =", n, "str =", str, "data =", data)
fmt.Printf("data as string: %s\n", data)</code>

出力:

n = 5 str = Hello, World! data = [72 101 108 108 111]
data as string: Hello

結論

copy 関数は、スライス間で要素をコピーするための Go の便利なツールです。通常のスライスと重複するスライスの両方を処理し、文字列からバイトのスライスにバイトをコピーすることもできます。 Go プログラムでスライスを効果的に操作するには、関数の動作を理解することが不可欠です。

以上がGo の「copy」関数は重複するスライスに対してどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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