Bagaimanakah saya boleh memetakan tag ke URL imej dengan cekap menggunakan penunjuk dalam Go sambil memastikan pengumpulan sampah yang betul?

Mary-Kate Olsen
Lepaskan: 2024-10-28 17:28:29
asal
546 orang telah melayarinya

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

Pengumpulan Sampah dan Penggunaan Penunjuk yang Betul dalam Go

Masalah:

Anda bekerja dengan bahasa dengan struktur data yang berbeza, seperti Python, dan anda ingin berhijrah ke Go. Anda tidak pasti cara memanfaatkan penunjuk dengan betul dalam program Go.

Secara khusus, anda mempunyai situasi di mana:

  • Anda mempunyai respons JSON yang besar dengan data imej dan teg yang sepadan.
  • Anda perlu mencipta struktur data dalam Pergi ke petakan setiap teg kepada senarai URL imej.
  • Anda mahu menggunakan penunjuk untuk mengoptimumkan penggunaan memori.

Soalan:

Bagaimanakah anda boleh menggunakan penunjuk dengan berkesan untuk memetakan teg kepada URL imej dalam program Go? Apakah pertimbangan yang perlu diambil untuk memastikan kutipan sampah dan pengurusan ingatan yang betul?

Jawapan:

1. Elakkan Menyimpan Penunjuk ke Medan:

  • Walaupun mungkin untuk menyimpan penunjuk ke medan tertentu dalam struct, ia tidak disyorkan.
  • Seluruh struct akan disimpan dalam ingatan sebagai selagi penunjuk masih hidup, walaupun anda hanya memerlukan medan tertentu.
  • Ini boleh membawa kepada pemecahan memori yang tidak diingini.

2. Nilai Rentetan Berkelakuan Seperti Penunjuk:

  • Nilai rentetan dalam Go diwakili oleh struct kecil yang dipanggil reflect.StringHeader yang mengandungi penuding kepada data rentetan sebenar.
  • Apabila menghantar atau menyalin rentetan, anda pada asasnya menghantar atau menyalin struct reflect.StringHeader ini, bukan keseluruhan data rentetan.
  • Ini bermakna nilai rentetan sudah bertindak seperti penunjuk.

3. Gunakan Interner Rentetan:

  • Untuk mengoptimumkan memori dengan lebih lanjut, gunakan interner rentetan untuk menghalang penciptaan berbilang salinan nilai rentetan yang sama.
  • Ini memastikan bahawa hanya satu kejadian setiap rentetan unik disimpan dalam ingatan.
  • Setelah interner tidak diperlukan lagi, anda boleh mengosongkan cachenya untuk melepaskan rentetan yang dipegangnya.

Kod Contoh:

<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>
Salin selepas log masuk

Sumber Tambahan:

  • [Penunjuk dalam Go](https://go.dev/blog/pointers): An pengenalan kepada penunjuk dalam Go.
  • [Effective Go](https://go.dev/doc/effective_go): Panduan untuk menulis kod Go idiomatik.
  • [Kutipan Sampah dalam Go] (https://dave.cheney.net/2013/06/03/garbage-collection-in-go): Penjelasan terperinci tentang pengumpulan sampah dalam Go.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memetakan tag ke URL imej dengan cekap menggunakan penunjuk dalam Go sambil memastikan pengumpulan sampah yang betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!