Go에서 포인터는 복사하지 않고 메모리에 저장된 데이터를 참조하는 데 사용됩니다. 데이터 그 자체. 이는 특히 크거나 복잡한 데이터 구조로 작업할 때 성능과 메모리 효율성을 향상시킬 수 있습니다.
제공된 코드는 태그를 이미지 URL 목록에 매핑하는 데이터 구조를 생성하기 위한 것입니다. . 그러나 초기 설계에서는 메모리를 절약하기 위해 포인터를 사용하는 것을 고려했기 때문에 할당된 메모리의 최종 정리에 대한 의문이 제기되었습니다.
버전 1:
버전 2:
URL을 저장하는 가장 효율적인 접근 방식은 포인터 없이 직접 문자열 값을 사용하는 것입니다. Go는 동일한 문자열에 대한 여러 참조가 단일 메모리 할당을 공유할 수 있도록 하는 문자열 풀을 사용하여 문자열을 저장함으로써 이미 문자열 처리를 최적화합니다.
메모리를 더욱 절약하기 위해 코드는 문자열 인턴을 사용할 수 있습니다. 여기에는 문자열 인스턴스를 하나만 저장하고 동일한 문자열이 나타날 때마다 이를 참조하는 작업이 포함됩니다.
제공된 코드에는 캐시를 사용하여 이전에 발생한 문자열을 저장하고 재사용하는 간단한 문자열 인터닝 함수(interned())가 포함되어 있습니다. .
<code class="go">package main import ( "bytes" "encoding/json" "fmt" ) type Image struct { URL string Description string Tags []Tag } type Tag struct { Name string Rank int } func searchImages() []*Image { parsedJSON := []*Image{ &Image{ URL: "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg", Description: "Ocean islands", Tags: []Tag{ Tag{"ocean", 1}, Tag{"water", 2}, Tag{"blue", 3}, Tag{"forest", 4}, }, }, &Image{ URL: "https://c3.staticflickr.com/1/48/164626048_edeca27ed7_o.jpg", Description: "Bridge over river", Tags: []Tag{ Tag{"bridge", 1}, Tag{"river", 2}, Tag{"water", 3}, Tag{"forest", 4}, }, }, } return parsedJSON } func interned(s string) string { if str, ok := cache[s]; ok { return str } cache[s] = s return s } var cache = make(map[string]string) func main() { result := searchImages() 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) } } // Clear the interner cache cache = nil // Trim allocated slices to the minimum needed for tagName, urls := range tagToUrlMap { if cap(urls) > len(urls) { urls2 := make([]string, len(urls)) copy(urls2, urls) tagToUrlMap[tagName] = urls2 } } enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") if err := enc.Encode(tagToUrlMap); err != nil { panic(err) } }</code>
위 내용은 데이터 구조에서 메모리 누수를 방지하면서 메모리 효율성을 위해 Go에서 포인터를 효과적으로 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!