В Go аргументы передаются по значению. ValueOf(x) получает копию. Изменение копии бессмысленно, поэтому CanSet() возвращает false.
var n int = 10
v := reflect.ValueOf(n)
fmt.Println(v.CanSet()) // false
vp := reflect.ValueOf(&n)
ve := vp.Elem()
fmt.Println(ve.CanSet()) // true
ve.SetInt(20)
fmt.Println(n) // 20