그래서 나는 내 머리를 감쌀 수없는 초급 질문으로 돌아 왔습니다. 다음 코드를 실험하고있었습니다.Golang : 포인터, 할당 및 예기치 않은 동작을 이해하는 데 도움이됩니다.
func main() {
start := time.Now()
var powers []*big.Int
for i := 1; i < 1000; i++ {
I := big.NewInt(int64(i))
I.Mul(I, I)
powers = append(powers, I)
}
fmt.Println(powers)
fmt.Println(time.Since(start))
start = time.Now()
var seqDiffs []*big.Int
diff := new(big.Int)
for i, v := range powers {
if i == len(powers)-2 {
break
}
diff = v.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, diff)
}
fmt.Println(seqDiffs)
fmt.Println(time.Since(start))
}
내 의도는
diff.Sub(powers[i+1], v)
그러나이 이상에 걸쳐 반복 년과 1995 년 (올바른 마지막 값) 인 seqDiffs의 값에서 결과 다음과 같은 방법으로 diff를 위해 서브()의 결과를 할당하는 것이 었습니다. 나는 seqDiffs가 동일한 메모리 주소에 대한 포인터 단지 목록입니다하지만 내가 이해 해달라고 무엇 때문에이 가능성이 알고 왜이 모든 홀수 번호의 목록 인 seqDiffs 결과
v.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, v)
잘 다음 작품 3에서 1995까지 정확한지는 모르겠지만 이것은 본질적으로 여전히 동일한 메모리 주소에 대한 포인터 목록입니다. 또한 seqDiffs가 동일한 메모리 주소에 대한 포인터의 목록이기도 한 경우에도 다음과 같이 올바른 이유는 무엇입니까?
diff = v.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, diff)
또한 내가 그것을 다음과 같은 방법
diff := new(*big.Int)
for i, v := range powers {
if i == len(powers)-2 {
break
}
diff.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, diff)
}
을하려고 노력하지만, IDE에서 이러한 오류를받은 :
*./sequentialPowers.go:26: calling method Sub with receiver diff (type **big.Int) requires explicit dereference
./sequentialPowers.go:27: cannot use diff (type **big.Int) as type *big.Int in append*
가 어떻게이 "명시 적"역 참조 할 것?
에 추가, 당신은 결국 한 포인터를 가리키는 포인터. new()는 무언가를 가리키는 포인터를 반환하고 새로운 포인터는 큰 포인터를 가리 킵니다. 그래서'diff : = new (* big.Int)'는 diff를 포인터에 대한 포인터로 만듭니다. 이것은 큰 포인터를 기대하기 때문에 그것을 사용하려는 곳에서는 사용할 수 없다는 것을 의미합니다. –