go-delve/delve · error

%s has no member %s

Error message

%s has no member %s

What it means

memberVariable lookups for fake-address variables (loaded synthetic variables such as map/chan internals) walk preloaded children by name. When no child matches memberName, this error states the parent has no such member. The name was misspelled or the parent does not structurally contain it.

Source

Thrown at pkg/proc/variables.go:1155

}

// structField returns the field named memberName in v.
// This function is meant for internal use, it does not support interfaces, embeds or member methods. For those cases findStructMemberOrMethod should be used instead.
func (v *Variable) structField(memberName string) (*Variable, error) {
	if v.Unreadable != nil {
		return v.clone(), nil
	}
	vname := v.Name
	if v.Name == "" {
		vname = v.DwarfType.String()
	}
	if v.loaded && (v.Flags&VariableFakeAddress) != 0 {
		for i := range v.Children {
			if v.Children[i].Name == memberName {
				return &v.Children[i], nil
			}
		}
		return nil, fmt.Errorf("%s has no member %s", vname, memberName)
	}
	closure := false
	switch v.Kind {
	case reflect.Chan:
		v = v.clone()
		v.RealType = godwarf.ResolveTypedef(&(v.RealType.(*godwarf.ChanType).TypedefType))
	case reflect.Func:
		fn := v.bi.PCToFunc(v.Base)
		v.loadFunctionPtr(0, LoadConfig{MaxVariableRecurse: -1})
		if v.Unreadable != nil {
			cst := fn.extra(v.bi).closureStructType
			if cst == nil || cst.ByteSize == 0 {
				// Not a closure, normal function
				if _, ok := v.bi.PackageMap[vname]; ok {
					return nil, fmt.Errorf("package %s has no function %s", vname, memberName)
				}
				return nil, fmt.Errorf("%s has no member %s", vname, memberName)
			}

View on GitHub (pinned to a23773e6c3)

Solutions

  1. Print the parent variable alone (eval vname) and inspect its actual member names.
  2. Correct the member name spelling/casing.
  3. Check the expected field names against your Go runtime version — internals change; upgrade Delve for current layouts.
  4. Use the locals/vars commands to discover valid names instead of guessing.

Example fix

// before
dlv> eval m.count
Command failed: m has no member count

// after: inspect then use a real member
dlv> eval m          // view children
dlv> eval m.count._  // or the correct runtime field
Defensive patterns

Strategy: validation

Validate before calling

parent, err := client.EvalVariable(scope, vname, cfg)
if err != nil { return err }
for _, c := range parent.Children {
    if c.Name == memberName { return nil } // safe to evaluate vname.memberName
}
return fmt.Errorf("%s has no member %s", vname, memberName)

Try / catch

v, err := client.EvalVariable(scope, vname+"."+memberName, cfg)
if err != nil && strings.Contains(err.Error(), "has no member") {
    // inspect parent children and pick a valid member name
}

Prevention

When it happens

Trigger: Evaluating expr like 'mapVar.key' or 'chanVar.buffer' where vname's variable was loaded with VariableFakeAddress and none of its children match the requested member name.

Common situations: Typo in a field name; accessing runtime-internal fields whose names changed between Go versions (e.g. hmap bucket fields); assuming a synthetic variable has members it does not.

Related errors


AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31). Data as JSON: /api/errors/12ad4f6b5502b101. Report an issue: GitHub.