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;
}
그것은 좋은 것입니다.
또한보십시오 http://stackoverflow.com/questions/20224478/dereferencing-a-map-index-in-golang – nos
위로 대답으로 말하면, 그것은 버킷에 값을 저장하는 해시 테이블입니다. 다시 칠하면 값이 이동합니다. 이 문제를 해결하려면 포인터를 값 유형으로 사용하십시오. – twotwotwo
C++'map's은 새로운 노드를 추가하기 위해 기존 노드를 RAM 주위로 이동시킬 필요가없는 이진 트리이기 때문에 (O (log n), O (1)이 아닌) 연산을 제거합니다. C++ 'unordered_map'은 해시 테이블이지만 값 이동을 피하기 위해 구현에 대한 특정 제한을 두어야합니다. http://stackoverflow.com/a/31113618/2714852 및 http://stackoverflow.com/q/37428119/을 참조하십시오. – twotwotwo