首頁 > 後端開發 > Golang > 如何使用 Go 中的指標有效地將標籤對應到圖像 URL,同時確保正確的垃圾收集?

如何使用 Go 中的指標有效地將標籤對應到圖像 URL,同時確保正確的垃圾收集?

Mary-Kate Olsen
發布: 2024-10-28 17:28:29
原創
626 人瀏覽過

 How can I efficiently map tags to image URLs using pointers in Go while ensuring proper garbage collection?

Go 中的垃圾收集和指針的正確使用

問題:

你是使用具有不同資料結構的語言(例如Python),並且您想要遷移到Go。您不確定如何在 Go 程式中正確利用指標。

具體而言,您遇到以下情況:

  • 您有一個很大的 JSON 回應包含圖像資料和相應的標籤。
  • 您需要在 Go 中建立資料結構,以將每個標籤對應到圖像 URL 清單。
  • 您想要使用指標來最佳化記憶體使用。

問題:

如何在 Go 程式中有效地使用指標將標籤對應到圖片 URL?應採取哪些注意事項來確保正確的垃圾收集和記憶體管理?

答案:

1.避免儲存指向欄位的指標:

  • 雖然可以在結構中儲存指向特定欄位的指針,但不建議這樣做。
  • 整個結構將保存在記憶體中,如下所示只要指標處於活動狀態,即使您只需要特定欄位。
  • 這可能會導致不必要的記憶體碎片。

2.字串值的行為類似指標:

  • Go 中的字串值由名為reflect.StringHeader 的小結構表示,其中包含指向實際字串資料的指標。
  • 傳遞或複製字串時,實際上是傳遞或複製這個 reflect.StringHeader 結構,而不是整個字串資料。
  • 這表示字串值已經像指標一樣運作。

3.使用字串內部函數:

  • 要進一步最佳化內存,請使用字串內部函數來防止建立相同字串值的多個副本。
  • 這可確保只有一個實例每個唯一字串的儲存在記憶體中。
  • 一旦不再需要interner,您可以清除其快取以釋放其保存的字串。

範例程式碼:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "os"
    "reflect"
)

type Image struct {
    URL        string
    Description string
    Tags        []*Tag
}

type Tag struct {
    Name string
    Rank int
}

// this function mimics json.NewDecoder(resp.Body).Decode(&amp;parsedJSON)
func searchImages() []*Image {
    parsedJSON := []*Image{
        &amp;Image{
            URL:        "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg",
            Description: "Ocean islands",
            Tags: []*Tag{
                &amp;Tag{"ocean", 1},
                &amp;Tag{"water", 2},
                &amp;Tag{"blue", 3},
                &amp;Tag{"forest", 4},
            },
        },
        &amp;Image{
            URL:        "https://c3.staticflickr.com/1/48/164626048_edeca27ed7_o.jpg",
            Description: "Bridge over river",
            Tags: []*Tag{
                &amp;Tag{"bridge", 1},
                &amp;Tag{"river", 2},
                &amp;Tag{"water", 3},
                &amp;Tag{"forest", 4},
            },
        },
    }
    return parsedJSON
}

func main() {
    result := searchImages()

    cache := map[string]string{}

    tagToUrlMap := make(map[string][]string)

    for _, image := range result {
        imageURL := intern(image.URL, cache)

        for _, tag := range image.Tags {
            tagName := intern(tag.Name, cache)
            tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL)
        }
    }

    cache = nil

    enc := json.NewEncoder(os.Stdout)
    enc.SetIndent("", "  ")
    if err := enc.Encode(tagToUrlMap); err != nil {
        panic(err)
    }
}

func intern(s string, cache map[string]string) string {
    if s2, ok := cache[s]; ok {
        return s2
    }

    // New string, store it
    cache[s] = s
    return s
}</code>
登入後複製

其他資源:

  • 其他資源:
  • 其他資源:
其他資源:其他資源:[Go 中的指針>[Go 中的指針> ](https://go.dev/blog/pointers): Go 中的指標簡介。 [Effective Go](https://go.dev/doc/ effective_go):撰寫慣用的 Go 程式碼的指南。 [Go 中的垃圾收集] (https://dave.cheney.net/2013/06/03/garbage-collection-in-go):Go 中垃圾收集的詳細解釋。

以上是如何使用 Go 中的指標有效地將標籤對應到圖像 URL,同時確保正確的垃圾收集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板