Upgrade to Pro — share decks privately, control downloads, hide ads and more …

go-exhaustruct linterのすすめ

Avatar for Shoichi Kaji Shoichi Kaji
February 27, 2026
76

go-exhaustruct linterのすすめ

kamakura.go #8 2026/02/27

Avatar for Shoichi Kaji

Shoichi Kaji

February 27, 2026
Tweet

Transcript

  1. ໰୊ҙࣝ package user type Input struct { Name string Age

    int } type User struct { Name string Age int } func New(input Input) (*User, error) { // όϦσʔγϣϯͳͲΛ͔·͢ return &User{ Name: input.Name, Age: input.Age, }, nil } user.User͕͋Δͱ͢Δ ͦΕΛ֤ॴͰ࢖͍ͬͯΔ // ࢖༻৔ॴ1 usr, err := user.New(user.Input{ Name: "Taro", Age: 25, }) // ࢖༻৔ॴ2 for _, r := range results { u, err := user.New(user.Input{ Name: r.Name, Age: r.Age, }) // ... }
  2. ໰୊ҙࣝ package user type Input struct { Name string Age

    int Address string // ௥Ճʂ } type User struct { Name string Age int Address string } func New(input Input) (*User, error) { // όϦσʔγϣϯͳͲΛ͔·͢ return &User{ Name: input.Name, Age: input.Age, Address: input.Address, }, nil } user.UserʹAddress௥Ճ AddressΛ௥Ճ͠๨ΕΔ😢 // ࢖༻৔ॴ1 usr, err := user.New(user.Input{ Name: "Taro", Age: 25, Address: "Tokyo", // ͜͜͸ͪΌΜͱ௥Ճͨ͠ }) // ࢖༻৔ॴ2 for _, r := range results { u, err := user.New(user.Input{ Name: r.Name, Age: r.Age, // ๨Ε͍ͯΔ... }) // ... }
  3. go-exhaustructͱ͸ʁ • structͷϑΟʔϧυ͕શͯ໌ࣔతʹॻ͔Ε͍ͯΔ͜ ͱΛ੩తʹݕ஌͢Δlinter • ઌͷྫͩͱɺҎԼͷΑ͏ʹAddressࢦఆ๨ΕΛݕ ஌Ͱ͖Δ👍 • ❯ golangci-lint

    run --enable exhaustruct ./... main.go:6:23: user.Input is missing field Address (exhaustruct) usr, err := user.New(user.Input{ ^ 1 issues: * exhaustruct: 1
  4. go-exhaustructͱ͸ʁ • ͢Ͱʹgolangci-lint࢖ͬͯΔਓ͸enable exhaustructͱ͢Ε ͹Α͍ • ઃఆͰ͍Ζ͍ΖΧελϚΠζࢦఆͰ͖Δ • ࠷ॳ͸ؾʹͳΔͱ͜Ζ͚ͩenableʹ͢Δͱಋೖ͠΍͍͢ •

    coreͷpackage͸ignoreʹͯ͠΋Αͦ͞͏ • ࣮ࡍɺۀ຿ΞϓϦέʔγϣϯͷCIʹ૊ΈࠐΜͰ͓Γɺgo- exhaustruct༗༻ͩͳͱࢥ͍ͬͯΔ