2012-10-14 5 views
3

Go에서 힙에 직접 원시 정수 유형을 생성하려면 어떻게해야합니까? 복합 리터럴 Go에서 힙에 직접 기본 유형을 생성 하시겠습니까?

following syntax이 지원됩니다

return &File{fd, name, nil, 0} 

그러나 이러한 상응하는 int과 친구를 위해 존재하는 것 같다 :

Size: &uint64(entry.FileInfo.Size()), 

D : \ gopath \ SRC \의 bitbucket. org \ anacrolix \ dms \ dlna \ dms \ dms.go : 271 : uint64 (entry.FileInfo.Size())의 주소를 사용할 수 없습니다.

답변

2

Address operators

는 기입 동작 & X는 X *에 입력 된 T의 포인터를 생성한다. 피연산자는 주소 지정 가능해야합니다. 즉, 변수, 포인터 간접 참조 또는 슬라이스 인덱싱 작업 중 하나입니다. 또는 주소 지정 가능한 struct 피연산자의 필드 선택자. 또는 배열 주소 지정 가능 배열의 인덱싱 작업. 주소 지정 요구 사항의 예외로 x는 복합 리터럴 일 수도 있습니다.

프리미티브 정수 유형을 처리 할 수 ​​없습니다. 정수가 레지스터 변수 인 경우 메모리 주소가 없습니다. 정수가 상수이면 메모리 주소를 제공하면 정수가 수정됩니다.

따라서 정수 유형 변수를 만들고 주소를 가져 오거나 정수 포인터 유형을 사용하십시오. 예를 들어,

package main 

import "fmt" 

func main() { 
    var i int = 42 
    var pi = &i 
    j := int(7) 
    pj := &j 
    var pk = new(int) 
    k := *pk 
    fmt.Println(i, pi) 
    fmt.Println(j, pj) 
    fmt.Println(k, pk) 
} 

출력 :

42 0xf840043100 
7 0xf840043108 
0 0xf840043110 
1

new을 사용하여 유형에 대한 포인터를 초기화하면 항상 힙에 할당됩니다.

n := new(int64) 
*n = entry.FileInfo.Size() 
return &n 

할당 된 정수의 주소를 취할 수도 있습니다. 스택에 할당 된 객체에 대한 포인터를 반환 할 때 Go의 이스케이프 분석은이 객체가 힙으로 승격되었는지 확인합니다. 이것은 힙에 즉시 할당하지는 않지만 결국 끝납니다. &T{} 접근 방식은 프리미티브 작동하지 않는 이유에 대한 질문에 관해서는

n := entry.FileInfo.Size() 
return &n 

, 내가 잊고 것으로 보인다. 나는 그것에 대한 좋은 이유가 있음을 알고 있지만 아마도이 문제에 관해 더 많은 지식을 가진 누군가가 우리에게 계몽 할 수 있습니다. T 형의 오퍼랜드 X 용