>  기사  >  백엔드 개발  >  Golang 함수에서 구조체 포인터와 구조체 값 전송의 차이점

Golang 함수에서 구조체 포인터와 구조체 값 전송의 차이점

WBOY
WBOY원래의
2024-05-31 19:43:59888검색

Go에서는 함수 매개변수를 값이나 포인터로 전달할 수 있습니다. 값을 전달하면 복사본이 전달되고 복사본을 수정해도 원래 값에는 영향을 주지 않습니다. 포인터를 전달하면 주소가 전달되고 콘텐츠 수정 사항이 원래 값에 반영됩니다. 실제로 포인터 전달은 예를 들어 슬라이스를 정렬할 때 코드를 최적화하는 데 사용될 수 있습니다. 코드를 최적화하고 성능을 향상하려면 올바른 전달 방법을 선택하는 것이 중요합니다.

Golang 函数中 struct 指针与 struct 值传递的区别

Go에서 함수 매개변수 전달: 값 전달 및 포인터 전달

Go에서는 함수 매개변수를 값이나 포인터로 전달할 수 있습니다. Go 프로그래밍을 마스터하려면 이 두 가지 전달 방법의 차이점을 이해하는 것이 중요합니다.

값별 전달

값별 전달은 함수가 들어오는 매개변수 값의 복사본을 수신한다는 의미입니다. 매개변수 값을 수정해도 원래 값에는 영향을 주지 않습니다. 예:

func changeValue(s string) {
    s = "modified"
}

func main() {
    var s = "original"
    changeValue(s)
    fmt.Println(s) //输出: original
}

changeValue 함수에서 sstring 유형의 복사본입니다. s에 대한 수정 사항은 main 함수의 원래 s 변수에 영향을 주지 않습니다. changeValue 函数中,sstring 类型的副本。对 s 的修改不会影响 main 函数中的原始 s 变量。

指针传递

指针传递是指函数接收传入参数的地址。对参数内容的任何修改都会反映在原始变量中。例如:

func changePointer(s *string) {
    *s = "modified"
}

func main() {
    var s = "original"
    changePointer(&s)
    fmt.Println(s) //输出: modified
}

changePointer 函数中,s 是指向原始 string 变量 s 的指针。对 *s 的修改会直接修改 main 函数中的原始 s 变量。

实战案例

以下是一个利用指针传递在实际场景中进行代码优化的示例:

type Person struct {
    Name string
    Age  int
}

func sortByName(people []Person) {
    for i := 0; i < len(people)-1; i++ {
        for j := i + 1; j < len(people); j++ {
            if people[i].Name > people[j].Name {
                // 交换 people[i] 和 people[j]
                people[i], people[j] = people[j], people[i]
            }
        }
    }
}

func main() {
    people := []Person{
        {"Alice", 20},
        {"Bob", 25},
        {"Charlie", 30},
    }
    sortByName(people)
    fmt.Println(people) //输出: [{Alice 20} {Bob 25} {Charlie 30}]
}

在这个示例中,sortByName 函数接收一个 Person

포인터 전달

포인터 전달은 함수가 들어오는 매개변수의 주소를 받는다는 것을 의미합니다. 매개변수 내용에 대한 수정 사항은 원래 변수에 반영됩니다. 예:

rrreee

changePointer 함수에서 s는 원래 string 변수 s에 대한 포인터입니다. *s를 수정하면 main 함수의 원래 s 변수가 직접 수정됩니다. 🎜🎜🎜실용 사례🎜🎜🎜다음은 실제 시나리오에서 코드 최적화를 위해 포인터 전달을 사용하는 예입니다. 🎜rrreee🎜이 예에서 sortByName 함수는 Person을 받습니다. 슬라이스에 대한 포인터입니다. 포인터를 전달하면 이 함수는 복사본을 만들지 않고도 슬라이스의 내용을 직접 수정할 수 있습니다. 이는 특히 슬라이스가 큰 경우 함수의 효율성을 향상시킵니다. 🎜🎜🎜결론🎜🎜🎜Go 프로그램을 효율적으로 작성하려면 값 전달과 포인터 전달의 차이를 이해하는 것이 중요합니다. 원래 값이 아닌 복사본을 수정해야 할 경우에는 값으로 전달하는 것이 적합하고, 원래 값을 수정해야 할 경우에는 포인터로 전달하는 것이 적합합니다. 필요에 따라 올바른 전달 방법을 선택하면 코드를 최적화하고 프로그램 성능을 향상시킬 수 있습니다. 🎜

위 내용은 Golang 함수에서 구조체 포인터와 구조체 값 전송의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.