Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

shrink: share one seen map in unnamedStructs

Chiusa Adatta ai principianti
#125 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
1/5
Tempo stimato
Meno di un'ora
Idoneità per principianti
86/100
Tipo di issue
Refactoring
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
go

Direzione di ricerca

Inizia in internal/shrink/evidence.go, in unnamedStructs intorno alla riga 306, e leggi evidenceCollectUnnamed per capire come seen impedisce le visite ricorsive. Sposta la mappa seen nell’ambito a livello di esecuzione mostrato nell’issue, quindi verifica che unnamed rimanga invariato mentre i tipi condivisi vengano attraversati una sola volta.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

enhancement

Summary

unnamedStructs (internal/shrink/evidence.go:306) starts a fresh seen map for every entry in TypesInfo.Types. The same types are walked again for every expression that has them. One shared seen map per run walks each type once.

Current shape

for expr, tv := range p.TypesInfo.Types {
	if !defining[expr] {
		evidenceCollectUnnamed(tv.Type, &unnamed, map[types.Type]bool{}) // new map per expression
	}
}

func evidenceCollectUnnamed(t types.Type, into *typeutil.Map, seen map[types.Type]bool) {
	if t == nil || seen[t] {
		return
	}
	seen[t] = true
	switch t := types.Unalias(t).(type) {
	case *types.Signature:
		evidenceCollectUnnamed(t.Params(), into, seen) // walks into every parameter
		evidenceCollectUnnamed(t.Results(), into, seen)
	...
	}
}

Why the change helps

TypesInfo.Types has one entry per expression. Many expressions share one type object:

  • Every call to one function has the same *types.Signature, and that signature is walked again for each call.
  • Every mention of a map[string][]*Item walks the map, the slice and the pointer again.

seen is only there to stop recursion. The results go into unnamed, a typeutil.Map, which already removes duplicates. So a type that is already in seen has already put all its unnamed structs into unnamed. Walking it again adds nothing.

seen := map[types.Type]bool{} // one per run
for _, p := range m.Widest() {
	...
	for expr, tv := range p.TypesInfo.Types {
		if !defining[expr] {
			evidenceCollectUnnamed(tv.Type, &unnamed, seen)
		}
	}
}

The cost goes from the sum of type sizes over all expressions down to the sum over distinct types.

Risk

None. seen only prunes recursion, and the output set is the same.

Not measured yet. A trivial change.

Lingua principale
Go
Stelle
42
Fork
1
Merge medio
1h 20m
PR unite (30g)
100

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.