2016-07-03 2 views
4

Go 코드로 게임하는 동안지도 값을 처리 할 수 ​​없다는 것을 알았습니다. 예를 들어,지도 값을 처리 할 수없는 이유는 무엇입니까?

package main 
import "fmt" 

func main(){ 
    var mymap map[int]string = make(map[int]string) 
    mymap[1] = "One" 
    var myptr *string = &mymap[1] 
    fmt.Println(*myptr) 
} 

에러 생성

mapaddressable.go : 7 : 내지도의 주소를 취할 수 없음 [1]

코드 반면

package main 
import "fmt" 

func main(){ 
    var mymap map[int]string = make(map[int]string) 
    mymap[1] = "One" 
    mystring := mymap[1] 
    var myptr *string = &mystring 
    fmt.Println(*myptr) 
} 

은 완벽하게 작동합니다.

왜 이렇게됩니까? Go 개발자가 특정 값을 지정할 수없는 이유는 무엇입니까? 이것이 언어의 단점입니까?

편집 : 는 C에서 존재는 ++ 배경, 나는 이동에 널리 퍼진 것 같다이 not addressable 추세에 사용하고 있지 않다. 예를 들어, 다음 코드는 잘 작동 : 같은 주소 지정이 이동에 (또는 의도적으로 실현되지 않았다)을 달성 할 수없는 이유를 누군가가 지적 할 수 있다면

#include<iostream> 
#include<map> 
#include<string> 
using namespace std; 
int main(){ 
    map<int,string> mymap; 
    mymap[1] = "one"; 
    string *myptr = &mymap[1]; 
    cout<<*myptr; 
} 

그것은 좋은 것입니다.

+1

또한보십시오 http://stackoverflow.com/questions/20224478/dereferencing-a-map-index-in-golang – nos

+1

위로 대답으로 말하면, 그것은 버킷에 값을 저장하는 해시 테이블입니다. 다시 칠하면 값이 이동합니다. 이 문제를 해결하려면 포인터를 값 유형으로 사용하십시오. – twotwotwo

+0

C++'map's은 새로운 노드를 추가하기 위해 기존 노드를 RAM 주위로 이동시킬 필요가없는 이진 트리이기 때문에 (O (log n), O (1)이 아닌) 연산을 제거합니다. C++ 'unordered_map'은 해시 테이블이지만 값 이동을 피하기 위해 구현에 대한 특정 제한을 두어야합니다. http://stackoverflow.com/a/31113618/2714852 및 http://stackoverflow.com/q/37428119/을 참조하십시오. – twotwotwo

답변

8

글쎄지도의 내부 Go 구현에 대해서는 알지 못하지만 대부분 해시 테이블의 일종입니다. 따라서 항목 중 하나의 주소를 가져 와서 저장 한 다음 다른 항목을 입력하면 저장된 주소가 유효하지 않을 수 있습니다. 이것은로드 요소가 특정 임계 값을 초과하고 해시 테이블이 커질 필요가있을 때 해시 테이블의 내부 재구성 때문입니다.
따라서 이러한 오류를 피하기 위해 해당 항목 중 하나의 주소를 사용하는 것은 허용되지 않습니다.

+0

누군가 지적했습니다. https://github.com/golang/go/issues/11865 – weaming

관련 문제