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 중국어 웹사이트의 기타 관련 기사를 참조하세요!