> 백엔드 개발 > Golang > Go에서 값과 포인터 의미는 어떻게 다르며, 슬라이스는 어떻게 예외적인 동작을 나타냅니까?

Go에서 값과 포인터 의미는 어떻게 다르며, 슬라이스는 어떻게 예외적인 동작을 나타냅니까?

DDD
풀어 주다: 2024-12-31 02:04:09
원래의
900명이 탐색했습니다.

How Do Value and Pointer Semantics Differ in Go, and How Do Slices Exhibit Exceptional Behavior?

Go의 값 의미와 포인터 의미 이해

Go에서는 값 의미와 포인터 의미의 개념을 이해하는 것이 내부 코드를 이해하는 데 중요합니다. 배열과 슬라이스의 작동.

값 의미

Go의 함수나 메소드에 값이 전달되면 해당 값의 복사본이 생성됩니다. 이러한 복사본은 원래 값과 격리됩니다. 즉, 함수나 메서드 내에서 수정한 사항이 원래 값에 영향을 주지 않습니다.

예를 들어 다음 코드를 고려하세요.

func double(i int) int {
    i *= 2
    return i
}

func main() {
    i := 1
    fmt.Println("double:", double(i))
    fmt.Println("original i:", i)
}
로그인 후 복사

출력 이 코드는 값 의미를 보여줍니다.

double: 2
original i: 1
로그인 후 복사

double()이 i 매개 변수를 수정하더라도 호출 함수의 i 변수는 변경되지 않습니다. 이는 i의 복사본이 double()에 전달되었기 때문입니다.

포인터 의미

값 의미와 달리 포인터 의미는 값에 대한 포인터가 다음과 같은 경우를 나타냅니다. 값 자체 대신 전달됩니다. 함수나 메서드 내에서 포인터가 수정되면 변경 사항이 원래 값에 반영됩니다.

다음 코드를 고려하세요.

func doublep(i *int) int {
    *i *= 2
    return *i
}

func main() {
    i := 1
    fmt.Println("double:", doublep(&i))
    fmt.Println("original i:", i)
}
로그인 후 복사

이 코드의 출력은 포인터 의미 체계를 보여줍니다.

double: 2
original i: 2
로그인 후 복사

이 예에서는 i에 대한 포인터가 doublep()에 전달되어 함수가 i의 원래 값을 수정할 수 있도록 합니다.

슬라이스 전달: 값 의미론의 예외

Go는 값 의미론을 따르지만 배열과 슬라이스는 포인터 의미론을 나타냅니다. 슬라이스가 함수나 메서드에 전달되면 슬라이스 헤더(기본 배열이 아님)의 복사본이 생성됩니다. 그러나 원본 슬라이스와 복사된 슬라이스는 모두 동일한 기본 배열을 참조합니다. 따라서 함수 또는 메서드 내의 슬라이스 요소에 대한 수정 사항은 원본 슬라이스에 반영됩니다.

이 동작은 다음 코드에서 분명하게 나타납니다.

func doubles(is []int) []int {
    for i := range is {
        is[i] *= 2
    }
    return is
}

func main() {
    is := []int{1, 2}
    fmt.Println("double:", doubles(is))
    fmt.Println("original is:", is)
}
로그인 후 복사

출력:

double: [2 4]
original is: [2 4]
로그인 후 복사

Go에서 데이터를 효과적으로 사용하려면 값과 포인터 의미를 이해하는 것이 필수적입니다. 이를 통해 개발자는 값을 조작할 때 함수 및 메서드의 동작을 예측할 수 있습니다.

위 내용은 Go에서 값과 포인터 의미는 어떻게 다르며, 슬라이스는 어떻게 예외적인 동작을 나타냅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿