diff --git a/.golangci.reference.yml b/.golangci.reference.yml
index ea5a70b8..35e047a1 100644
--- a/.golangci.reference.yml
+++ b/.golangci.reference.yml
@@ -2485,6 +2485,7 @@ linters:
     - bodyclose
     - containedctx
     - contextcheck
+    - copyloopvar
     - cyclop
     - deadcode
     - decorder
@@ -2607,6 +2608,7 @@ linters:
     - bodyclose
     - containedctx
     - contextcheck
+    - copyloopvar
     - cyclop
     - deadcode
     - decorder
diff --git a/go.mod b/go.mod
index 2c6f6eca..1de62e5f 100644
--- a/go.mod
+++ b/go.mod
@@ -61,6 +61,7 @@ require (
 	github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af
 	github.com/jjti/go-spancheck v0.5.2
 	github.com/julz/importas v0.1.0
+	github.com/karamaru-alpha/copyloopvar v1.0.4
 	github.com/kisielk/errcheck v1.7.0
 	github.com/kkHAIKE/contextcheck v1.1.4
 	github.com/kulti/thelper v0.6.3
diff --git a/go.sum b/go.sum
index 9d63c8f9..e7c09483 100644
--- a/go.sum
+++ b/go.sum
@@ -322,6 +322,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
 github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
+github.com/karamaru-alpha/copyloopvar v1.0.4 h1:JD6IPXo4+RawkSPe9uMKh9OtTzYKsCelAgPMUwaVxBw=
+github.com/karamaru-alpha/copyloopvar v1.0.4/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k=
 github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0=
 github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ=
 github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
diff --git a/pkg/golinters/copyloopvar.go b/pkg/golinters/copyloopvar.go
new file mode 100644
index 00000000..0389dddd
--- /dev/null
+++ b/pkg/golinters/copyloopvar.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+	"github.com/karamaru-alpha/copyloopvar"
+	"golang.org/x/tools/go/analysis"
+
+	"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewCopyLoopVar() *goanalysis.Linter {
+	a := copyloopvar.Analyzer
+
+	return goanalysis.NewLinter(
+		a.Name,
+		a.Doc,
+		[]*analysis.Analyzer{a},
+		nil,
+	).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go
index fda1e320..46973acd 100644
--- a/pkg/lint/lintersdb/manager.go
+++ b/pkg/lint/lintersdb/manager.go
@@ -298,6 +298,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
 			WithLoadForGoAnalysis().
 			WithURL("https://github.com/kkHAIKE/contextcheck"),
 
+		linter.NewConfig(golinters.NewCopyLoopVar()).
+			WithSince("v1.57.0").
+			WithPresets(linter.PresetStyle).
+			WithURL("https://github.com/karamaru-alpha/copyloopvar"),
+
 		linter.NewConfig(golinters.NewCyclop(cyclopCfg)).
 			WithSince("v1.37.0").
 			WithLoadForGoAnalysis().
diff --git a/test/testdata/copyloopvar.go b/test/testdata/copyloopvar.go
new file mode 100644
index 00000000..a1fb4416
--- /dev/null
+++ b/test/testdata/copyloopvar.go
@@ -0,0 +1,36 @@
+//golangcitest:args -Ecopyloopvar
+package testdata
+
+import "fmt"
+
+func copyloopvarCase1() {
+	slice := []int{1, 2, 3}
+	fns := make([]func(), 0, len(slice)*2)
+	for i, v := range slice {
+		i := i // want `The copy of the 'for' variable "i" can be deleted \(Go 1\.22\+\)`
+		fns = append(fns, func() {
+			fmt.Println(i)
+		})
+		_v := v // want `The copy of the 'for' variable "v" can be deleted \(Go 1\.22\+\)`
+		fns = append(fns, func() {
+			fmt.Println(_v)
+		})
+	}
+	for _, fn := range fns {
+		fn()
+	}
+}
+
+func copyloopvarCase2() {
+	loopCount := 3
+	fns := make([]func(), 0, loopCount)
+	for i := 1; i <= loopCount; i++ {
+		i := i // want `The copy of the 'for' variable "i" can be deleted \(Go 1\.22\+\)`
+		fns = append(fns, func() {
+			fmt.Println(i)
+		})
+	}
+	for _, fn := range fns {
+		fn()
+	}
+}