---
# System prepended metadata

title: Go Default Value Setting
tags: [Go]

---

Go Default Value Setting
==========================
###### tags: `Go`

```go
package main


import "time"

const (
	CommonCart = "common"
	BuyNowCart = "buyNow"
)

// 把 Optional properties統一到一個結構中, 並且把該類給私有化
type cartExts struct {
	CartType string
	TTL      time.Duration
}

// 定義一個interface, 提供一個apply方法
// 方法的參數是Optional properties類別的指針類型, 因為要直接對該物件進行修改
type CartExt interface {
	apply(*cartExts)
}

// 利用該interface的實現, 封裝optional 屬性修改的方法, 建議已With+屬性名
func WithCartType(cartType string) CartExt {
	return newFuncCartExt(func(exts *cartExts) {
		exts.CartType = cartType
	})
}

func WithTTL(d time.Duration) CartExt {
	return newFuncCartExt(func(exts *cartExts) {
		exts.TTL = d
	})
}

// 這裡新增了類型，標記這個函數
// 定義一個Func type, 這func的參數要跟apply interface保持一致
type tempFunc func(*cartExts)

// 實現 CartExt interface
type funcCartExt struct {
	f tempFunc
}

// 具體的interface實現
func (fdo *funcCartExt) apply(e *cartExts) {
	fdo.f(e)
}

func newFuncCartExt(f tempFunc) *funcCartExt {
	return &funcCartExt{f: f}
}

type DemoCart struct {
	UserID string
	ItemID string
	Sku    int64
	Ext    cartExts
}

var DefaultExt = cartExts{
	CartType: CommonCart,       // 默認是普通購物車
	TTL:      time.Minute * 60, // 默認60MIN過期
}

func NewCart(userID string, Sku int64, exts ...CartExt) *DemoCart {
	c := &DemoCart{
		UserID: userID,
		Sku:    Sku,
		Ext:    DefaultExt, // 設定默認值
	}

	
	for _, ext := range exts {
		ext.apply(&c.Ext)
	}

	return c
}

func main() {
	exts := []CartExt{
		WithCartType(CommonCart),
		WithTTL(1000),
	}

	NewCart("Eddie", 888, exts...)
}

```
