ホームページ >バックエンド開発 >Golang >Golang では、ジェネリック関数はポインターと参照型をどのように処理しますか?

Golang では、ジェネリック関数はポインターと参照型をどのように処理しますか?

王林
王林オリジナル
2024-04-16 16:06:02586ブラウズ

Go でジェネリック関数がポインター型を処理する場合、元の変数への参照を受け取り、変数値を変更できるようになります。参照型は渡されるときにコピーされるため、関数は元の変数値を変更できなくなります。実際の例には、汎用関数を使用して文字列または数値のスライスを比較することが含まれます。

Golang では、ジェネリック関数はポインターと参照型をどのように処理しますか?

#Go でジェネリック関数がポインターと参照型を処理する方法

はじめに

ジェネリックは、さまざまなデータ型を処理できる関数を作成できる強力な機能です。ジェネリック関数がポインター型と参照型をどのように処理するかを理解することは、それらを最大限に活用するために重要です。

ポインタ型

ポインタは、別の変数のメモリ アドレスを指す変数です。ポインターをパラメーターとしてジェネリック関数に渡すと、関数は元の変数への参照を受け取ります。これにより、関数が変数の値を変更できるようになります。

import "fmt"

func PrintPointerValue[T any](ptr *T) {
    fmt.Println(*ptr)
}

func main() {
    num := 10
    PrintPointerValue(&num) // 输出 10
}

参照型

参照型は、ポインターを使用して、異なる変数間でデータを共有します。ポインターとは異なり、参照型はジェネリック関数に渡されるときにコピーされます。これにより、関数は元の変数の値を変更できなくなります。

import "fmt"

type Person struct {
    Name string
}

func PrintPersonName[T any](r T) {
    if p, ok := r.(Person); ok { // 类型断言
        fmt.Println(p.Name)
    }
}

func main() {
    p := Person{Name: "John"}
    PrintPersonName(p) // 输出 John
}

実用的なケース

次に、ジェネリック関数を使用して 2 つの文字列または整数スライスを比較するケースを示します:

import "fmt"

func Equal[T comparable](a, b []T) bool {
    if len(a) != len(b) {
        return false
    }
    for i, v := range a {
        if v != b[i] {
            return false
        }
    }
    return true
}

func main() {
    str1 := []string{"a", "b", "c"}
    str2 := []string{"a", "b", "c"}
    fmt.Println(Equal(str1, str2)) // 输出 true

    num1 := []int{1, 2, 3}
    num2 := []int{1, 2, 3}
    fmt.Println(Equal(num1, num2)) // 输出 true
}

以上がGolang では、ジェネリック関数はポインターと参照型をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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