Home >Backend Development >Golang >How do generic functions handle pointers and reference types in Golang?

How do generic functions handle pointers and reference types in Golang?

王林
王林Original
2024-04-16 16:06:02582browse

When a generic function handles pointer types in Go, it will receive a reference to the original variable, allowing the variable value to be modified. Reference types are copied when passed, making the function unable to modify the original variable value. Practical examples include using generic functions to compare strings or slices of numbers.

How do generic functions handle pointers and reference types in Golang?

How generic functions handle pointers and reference types in Go

Introduction

Generics are a powerful feature that allows us to create functions that can handle different data types. Understanding how generic functions handle pointer and reference types is critical to getting the most out of them.

Pointer type

A pointer is a variable that points to the memory address of another variable. When you pass a pointer as a parameter to a generic function, the function receives a reference to the original variable. This allows the function to modify the value of the variable.

import "fmt"

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

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

Reference types

Reference types use pointers to share data between different variables. Unlike pointers, reference types are copied when passed to generic functions. This makes it impossible for the function to modify the value of the original variable.

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
}

Practical case

The following is a case of using a generic function to compare two strings or integer slices:

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
}

The above is the detailed content of How do generic functions handle pointers and reference types in Golang?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn