Skip to content

errorlint vs type assertion with variable reuse #109

@ccoVeille

Description

@ccoVeille

Consider this code that works

Code that works
// package foo blah
package foo

import "fmt"

// Error is a package-level error type
type Error struct {
	Code string
}

func (Error) Error() string {
	return "an error occurred"
}

func checkError(err error) {
	switch errSpecific := err.(type) {
	case Error:
		fmt.Printf("error occurred: %s\n", errSpecific.Code)
		// do something
	case nil:
		// omit the element
	}
}

Now try this

// package foo blah
package foo

import "fmt"

// Error is a package-level error type
type Error struct {
	Code string
}

func (Error) Error() string {
	return "an error occurred"
}

func checkError(err error) {
	// create a new err variable
	switch err := err.(type) {
	case Error:
		fmt.Printf("error occurred: %s\n", err.Code)
		// do something
	case nil:
		// omit the element
	}
}

--fix will replace code with this that is invalid

		var err Error
		switch {
		case errors.As(err, &err):
			fmt.Printf("error occurred: %s\n", err.Code)
		case err == nil:
		}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions