# 設定

本頁說明 go-scheduler 的排程器設定、單一任務選項，以及日誌與 Worker 池的執行期預設值。

## 排程器設定

```go
type Config struct {
	Location *time.Location
}
```

| 欄位 | 預設 | 作用 |
|---|---|---|
| `Location` | `time.Local` | 計算 Cron 表達式與描述符下次觸發時間所用的時區 |

```go
loc, err := time.LoadLocation("Asia/Taipei")
if err != nil {
	log.Fatal(err)
}

c, err := core.New(core.Config{Location: loc})
if err != nil {
	log.Fatal(err)
}

if _, err := c.Add("30 9 * * 1-5", func() error {
	return sendReport()
}, "weekday report"); err != nil {
	log.Fatal(err)
}
```

`30 9 * * 1-5` 以 `Asia/Taipei` 時間於週一至週五 09:30 觸發。

套件不讀取環境變數或設定檔。

## 任務選項

`Add` 的可變參數依型別辨識，順序不限：

```go
func (c *cron) Add(spec string, action interface{}, arg ...interface{}) (int64, error)
```

| 型別 | 設定 | 備註 |
|---|---|---|
| `string` | 任務描述 | 依賴任務的日誌會輸出此值 |
| `time.Duration` | 執行時限 | 非啟動延遲；`0` 表示不設時限 |
| `func()` | 逾時回呼 | 僅在超過執行時限時呼叫 |
| `[]core.Wait` | 前置任務 | action 必須為 `func() error` |
| `[]int64` | 前置任務（已棄用） | 每個 ID 轉為 `Wait{ID: id}`，策略為 `Stop` |

同型別重複傳入時，`string`／`time.Duration`／`func()` 以最後一個為準，`[]core.Wait` 與 `[]int64` 會累加。

```go
_, err := c.Add("*/10 * * * *", func() error {
	return syncInventory()
}, "inventory sync", 2*time.Minute, func() {
	log.Println("inventory sync exceeded 2m")
}, []core.Wait{
	{ID: authID, State: core.Stop},
	{ID: cacheID, State: core.Skip},
})
if err != nil {
	log.Fatal(err)
}
```

## 依賴設定

| 欄位 | 值 | 效果 |
|---|---|---|
| `ID` | 前置任務 ID | 不存在時依賴任務失敗 |
| `State` | `core.Stop`（預設） | 前置任務失敗時，依賴任務失敗 |
| `State` | `core.Skip` | 忽略失敗的前置任務 |
| `Delay` | 任意 | 目前未生效，等待時限固定 1 分鐘 |

## 執行期預設值

| 項目 | 值 | 來源 |
|---|---|---|
| Logger | syslog（`LOG_INFO\|LOG_LOCAL0`，tag `goCron`）JSON 格式 | `core/instance.go` |
| Logger 備援 | stderr text 格式，等級 Info | syslog 無法建立時 |
| 依賴 Worker 數 | `runtime.NumCPU()`，CPU 數 ≤ 2 時為 2 | `core/depend.go` |
| Wait 佇列容量 | 1024 | `core/depend.go` |
| 依賴輪詢間隔 | 1ms | `core/dependManager.go` |
| `@every` 最小間隔 | 30 秒 | `core/schedule.go` |

以上數值皆無法由呼叫端調整。

執行期行為見 [任務依賴](/zh/core-concepts-dependencies) 與 [超時](/zh/core-concepts-timeouts)。
