Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

shrink: share one seen map in unnamedStructs

Cerrado Apto para principiantes
#125 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
1/5
Tiempo estimado
Menos de una hora
Aptitud para principiantes
86/100
Tipo de issue
Refactorización
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
go

Línea de trabajo

Comienza en internal/shrink/evidence.go, en unnamedStructs alrededor de la línea 306, y lee evidenceCollectUnnamed para entender cómo seen evita los recorridos recursivos. Mueve el mapa seen al ámbito de nivel de ejecución mostrado en el issue y verifica después que unnamed permanezca sin cambios, mientras que los tipos compartidos se recorren una sola vez.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Go
Estrellas
42
Forks
1
Merge medio
1 h 20 min
PR fusionados (30 d)
100

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.