Как в Go lang сделать рекурсивно chown и chmod

В стандартной библиотеке golang есть функции os.Chown() и os.Chmod(). Однако на вход они получают путь к файлу и работают не рекурсивно. Самым простым способом сделать рекурсивное изменение владельца, группы и прав доступа в файлу — объявить свои функции:

func ChownR(path string, uid, gid int) error {
	return filepath.Walk(path, func(name string, info os.FileInfo, err error) error {
		if err == nil {
			err = os.Chown(name, uid, gid)
		}
		return err
	})
}
func ChmodR(path string, mode os.FileMode) error {
	return filepath.Walk(path, func(name string, info os.FileInfo, err error) error {
		if err == nil {
			err = os.Chmod(name, mode)
		}
		return err
	})
}

Но если вы не ищите лёгких путей, то можете вызвать специально предназначенные для этого функции операционной системы:

func ChownR(path string, uid, gid int) error {
   cmd := exec.Command("chown", uid + ":" + gid, "-R", path)
   return cmd.Run()
}
func ChmodR(path string, mode os.FileMode) error {
   cmd := exec.Command("chmod", mode.String(), "-R", path)
   return cmd.Run()
}

Однако такое решение может оказаться не кроссплатформенным.