Python, Ruby 및 JavaScript에서 포인터는 다르게 작동합니다. Go보다. Go의 가비지 수집기는 메모리를 자동으로 해제하므로 메모리 소비를 최적화하고 불필요한 가비지 생성을 방지하려면 포인터 사용을 이해하는 것이 필수적입니다.
관련 태그가 있는 이미지 데이터 세트입니다. 우리는 각 태그를 해당 이미지 URL 목록에 매핑하는 데이터 구조를 만드는 것을 목표로 합니다.
<code class="python">{ "ocean": [ "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg" ], "water": [ "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg", "https://c3.staticflickr.com/1/48/164626048_edeca27ed7_o.jpg" ], ... }</code>
이 매핑을 나타내는 한 가지 방법은 포인터를 사용하는 것입니다. 이미지 구조체의 URL 필드:
<code class="go">tagToUrlMap := make(map[string][]*string) for _, image := range result { for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &image.URL) } }</code>
결과:
대체 접근 방식 중간 변수를 사용하고 이에 대한 포인터를 저장하는 것입니다.
<code class="go">tagToUrlMap := make(map[string][]*string) for _, image := range result { imageUrl = image.URL for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &imageUrl) } }</code>
결과:
또 다른 옵션은 다음과 같습니다. 이미지 구조체의 문자열에 대한 포인터를 사용합니다:
<code class="go">type Image struct { URL *string Description string Tags []*Tag }</code>
고려 사항:
메모리 효율성을 위한 최적의 솔루션은 고유한 문자열 값의 인스턴스 하나만 보장하는 문자열 인터닝을 사용하는 것입니다.
<code class="go">var cache = map[string]string{} func interned(s string) string { if s2, ok := cache[s]; ok { return s2 } cache[s] = s return s }</code>
구현:
<code class="go">tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := interned(image.URL) for _, tag := range image.Tags { tagName := interned(tag.Name) tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } }</code>
위 내용은 Go에서 포인터 및 가비지 수집 작업을 할 때 메모리 사용량을 효과적으로 관리하고 가비지 생성을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!