fix go1.18
diff --git a/go.mod b/go.mod
index bad14b7..9057e9b 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,3 @@
 module github.com/modern-go/reflect2
 
-go 1.18
+go 1.12
diff --git a/go_above_118.go b/go_above_118.go
new file mode 100644
index 0000000..2b4116f
--- /dev/null
+++ b/go_above_118.go
@@ -0,0 +1,23 @@
+//+build go1.18
+
+package reflect2
+
+import (
+	"unsafe"
+)
+
+// m escapes into the return value, but the caller of mapiterinit
+// doesn't let the return value escape.
+//go:noescape
+//go:linkname mapiterinit reflect.mapiterinit
+func mapiterinit(rtype unsafe.Pointer, m unsafe.Pointer, it *hiter)
+
+func (type2 *UnsafeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator {
+	var it hiter
+	mapiterinit(type2.rtype, *(*unsafe.Pointer)(obj), &it)
+	return &UnsafeMapIterator{
+		hiter:      &it,
+		pKeyRType:  type2.pKeyRType,
+		pElemRType: type2.pElemRType,
+	}
+}
\ No newline at end of file
diff --git a/go_below_118.go b/go_below_118.go
new file mode 100644
index 0000000..00003db
--- /dev/null
+++ b/go_below_118.go
@@ -0,0 +1,21 @@
+//+build !go1.18
+
+package reflect2
+
+import (
+	"unsafe"
+)
+
+// m escapes into the return value, but the caller of mapiterinit
+// doesn't let the return value escape.
+//go:noescape
+//go:linkname mapiterinit reflect.mapiterinit
+func mapiterinit(rtype unsafe.Pointer, m unsafe.Pointer) (val *hiter)
+
+func (type2 *UnsafeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator {
+	return &UnsafeMapIterator{
+		hiter:      mapiterinit(type2.rtype, *(*unsafe.Pointer)(obj)),
+		pKeyRType:  type2.pKeyRType,
+		pElemRType: type2.pElemRType,
+	}
+}
\ No newline at end of file
diff --git a/test.sh b/test.sh
deleted file mode 100755
index 3d2b976..0000000
--- a/test.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-echo "" > coverage.txt
-
-for d in $(go list github.com/modern-go/reflect2-tests/... | grep -v vendor); do
-    go test -coverprofile=profile.out -coverpkg=github.com/modern-go/reflect2 $d
-    if [ -f profile.out ]; then
-        cat profile.out >> coverage.txt
-        rm profile.out
-    fi
-done
diff --git a/unsafe_link.go b/unsafe_link.go
index de964d9..b49f614 100644
--- a/unsafe_link.go
+++ b/unsafe_link.go
@@ -25,12 +25,6 @@
 //go:noescape
 func mapaccess(rtype unsafe.Pointer, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer)
 
-// m escapes into the return value, but the caller of mapiterinit
-// doesn't let the return value escape.
-//go:noescape
-//go:linkname mapiterinit reflect.mapiterinit
-func mapiterinit(rtype unsafe.Pointer, m unsafe.Pointer, it *hiter)
-
 //go:noescape
 //go:linkname mapiternext reflect.mapiternext
 func mapiternext(it *hiter)
diff --git a/unsafe_map.go b/unsafe_map.go
index b8b747c..37872da 100644
--- a/unsafe_map.go
+++ b/unsafe_map.go
@@ -107,16 +107,6 @@
 	return type2.UnsafeIterate(objEFace.data)
 }
 
-func (type2 *UnsafeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator {
-	var it hiter
-	mapiterinit(type2.rtype, *(*unsafe.Pointer)(obj), &it)
-	return &UnsafeMapIterator{
-		hiter:      &it,
-		pKeyRType:  type2.pKeyRType,
-		pElemRType: type2.pElemRType,
-	}
-}
-
 type UnsafeMapIterator struct {
 	*hiter
 	pKeyRType  unsafe.Pointer