Example:
m := map[string]string{
"k1": "v1",
}
m["k2"] = "v2"
// returns function that you can call to verify that m didn't change
checkFunction := immcheck.EnsureImmutability(&m)
checkFunction() // no mutations are fine
func() {
defer func() {
mutationPanic := recover()
fmt.Println(mutationPanic)
}()
// you can also use defer for such checks
// now when we mutate m, we will get panic at the end of the function
defer immcheck.EnsureImmutability(&m)()
// it is also possible to set a finalizer that can check
// if object remained immutable from this point till garbage collection
immcheck.CheckImmutabilityOnFinalization(&m)
// this function works only with `-race` or `-tags immcheck` build flags
defer immcheck.RaceEnsureImmutability(&m)()
// this function works only with `-race` or `-tags immcheck` build flags as well
immcheck.RaceCheckImmutabilityOnFinalization(&m)
delete(m, "k1")
}()