p["HM"]
не является довольно регулярным адресуемым значением : хэш-карты могут расти во время выполнения , а затем их значения перемещаются в памяти, а старые местоположения становятся устарели. Если значения в картах рассматривались как обычные адресуемые значения, эти внутренние функции реализации map
были бы открыты.
Итак, p["HM"]
- это немного другая вещь, называемая выражением индекса в спецификации; если вы будете искать спецификацию для фразы «выражение индекса», вы увидите, что вы можете делать с ними определенные вещи, например, читать их, назначать им и использовать их в выражениях increment / decment (для числовых типов). Но вы не можете все. Они, возможно, предпочли реализовать специальные случаи more , чем они, но я предполагаю, что они не просто упростили ситуацию.
Ваш подход кажется хорошим здесь - вы измените его на обычное назначение, одну из специально разрешенных операций. Другой подход (возможно, хорош для больших структур, которые вы хотите избежать копирования?) - это сделать значение карты регулярным старым указателем , что вы можете изменить базовый объект с помощью:
package main
import "fmt"
type Person struct {
name string
age int
}
type People map[string]*Person
func main() {
p := make(People)
p["HM"] = &Person{"Hank McNamara", 39}
p["HM"].age += 1
fmt.Printf("age: %d\n", p["HM"].age)
}
Безусловно самое легкое должно сохранить метки времени как время изменения фиктивных файлов. GNU touch
и date
команды может установить/получить эти времена и выполнить вычисления даты. Bash имеет тесты, чтобы проверить, является ли файл более новым, чем (-nt
) или более старым, чем (-ot
) другой.
, Например, чтобы только отправить уведомление, если последнее уведомление было больше чем час назад:
touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
#send notification...
touch last_notification
fi
Используйте команду даты, чтобы преобразовать эти два раза в стандартный формат и вычесть их. Вы, вероятно, захотите сохранить предыдущее время выполнения в dotfile, тогда делают что-то как:
last = cat /tmp/.lastrun
curr = date '+%s'
diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
# ...
fi
echo "$curr" >/tmp/.lastrun
(Спасибо, Steve.)
Использование "тест":
if test file1 -nt file2; then
# file1 is newer than file2
fi
РЕДАКТИРОВАНИЕ: Если Вы хотите знать, когда событие имело место, можно использовать "касание" для создания файла, который можно позже сравнить использование "тест".