>백엔드 개발 >Golang >Golang은 구조에서 big.Int에 Exp를 사용하여 값을 이상하게 변경합니다.

Golang은 구조에서 big.Int에 Exp를 사용하여 값을 이상하게 변경합니다.

王林
王林앞으로
2024-02-12 14:00:07904검색

Golang 在结构体中使用 Exp for big.Int 奇怪地改变了值

질문 내용

아래 a 发生了意外的变化。 d 使用 a (*a) 的值构造,然后 d.c 被正确更改。但是为什么 a 更改为 Exp의 첫 번째 매개변수는?

으아악

저는 a 변함없기를 바랍니다.

EDIT: 추가하기 위해 abd.cd.q 的指针地址,并且在 Exp 之前和之后都不同: fmt.Printf("%p %p %p %p n", &a, &b, &d.c, &d.q), b, d.c, d.qExp 의 포인터 주소도 인쇄했습니다. code> 이전과 이후가 다릅니다: fmt.Printf("%p %p %p %p n", &a, &b, &d.c, &d.q)

Solution

다음은 더 간단한 예입니다. 동일한 콘텐츠 표시:

으아악

가장 먼저 고려해야 할 사항은 y.Exp “设置 z = x**y mod |m| (即 m 的符号被忽略),并返回 z。";因此 y 값이 변경되는 경우입니다(위에 표시됨).

x 값이 변경되는 이유를 이해하려면 문서에서 시작해 보세요.

"얕은 사본"이 바로 위의 y := *x (或代码中的 d := Decimal{*a, *b} ) 기능입니다. 따라서 해결책은 위의 조언을 따르는 것입니다:

으아악

(예제에서도 비슷한 작업을 수행할 수 있습니다).

이런 일이 발생하는 이유를 설명하려면 big.Int 정의를 살펴봐야 합니다. 이를 위해서는 일부 문서를 확인해야 하지만 간단히 말하면 다음과 같습니다.

으아악

따라서 얕은 복사본을 만들면 두 인스턴스의 슬라이스가 동일한 지원 배열을 공유하게 됩니다(이로 인해 슬라이스의 요소가 변경될 때 예측할 수 없는 결과가 발생할 수 있습니다).

귀하의 예에서는 set이 실행되었을 때입니다. 이를 입증하는 더 쉬운 방법은 다음과 같습니다.

으아악

위 내용은 Golang은 구조에서 big.Int에 Exp를 사용하여 값을 이상하게 변경합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제