아래 a
发生了意外的变化。 d
使用 a
(*a
) 的值构造,然后 d.c
被正确更改。但是为什么 a
更改为 Exp
의 첫 번째 매개변수는?
저는 a
변함없기를 바랍니다.
EDIT: 추가하기 위해 a
、b
、d.c
、d.q
的指针地址,并且在 Exp
之前和之后都不同: fmt.Printf("%p %p %p %p n", &a, &b, &d.c, &d.q)
, b
, d.c
, d.q
및 Exp
의 포인터 주소도 인쇄했습니다. code> 이전과 이후가 다릅니다: fmt.Printf("%p %p %p %p n", &a, &b, &d.c, &d.q)
다음은 더 간단한 예입니다. 동일한 콘텐츠 표시:
으아악가장 먼저 고려해야 할 사항은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!