diff --git a/README.md b/README.md
index ee15594..13222e6 100644
--- a/README.md
+++ b/README.md
@@ -66,306 +66,9 @@ cvt.Float("hello", 12.34) // 12.34
> 1000+ unit test cases, for more examples, see `*_test.go`
-## API
-
-### bool
-- Bool
-
-```go
-cvt.Bool(0) // false
-cvt.Bool(nil) // false
-cvt.Bool("0") // false
-cvt.Bool("false") // false
-cvt.Bool([]int{}) // false
-
-cvt.Bool(true) // true
-cvt.Bool("true") // true
-cvt.Bool([]int{1, 2}) // true
-cvt.Bool([]byte("true")) // true
-```
-
-- BoolE
-
-```go
-cvt.BoolE(0) // false,nil
-cvt.BoolE(nil) // false,nil
-cvt.BoolE("0") // false,nil
-cvt.BoolE("false") // false,nil
-cvt.BoolE([]int{}) // false,nil
-
-cvt.BoolE(true) // true,nil
-cvt.BoolE("true") // true,nil
-cvt.BoolE([]int{1, 2}) // true,nil
-cvt.BoolE([]byte("true")) // true,nil
-```
-
-- BoolP
-```go
-cvt.BoolP("true") // (*bool)(0x14000126180)(true)
-```
-
-> more case see [bool_test.go](bool_test.go)
-
-
-### int
-- Int
-- IntE
-- IntP
-- Int8
-- Int8E
-- Int8P
-- Int16
-- Int16E
-- Int16P
-- Int32
-- Int32E
-- Int32P
-- Int64
-- Int64E
-- Int64P
-- Uint
-- UintE
-- UintP
-- Uint8
-- Uint8E
-- Uint8P
-- Uint16
-- Uint16E
-- Uint16P
-- Uint32
-- Uint32E
-- Uint32P
-- Uint64
-- Uint64E
-- Uint64P
-
-```go
-cvt.Int(int8(8)) // 8
-cvt.Int(int32(8)) // 8
-cvt.Int("-8.01") // -8
-cvt.Int([]byte("8.00")) // 8
-cvt.Int(nil) // 0
-cvt.IntE("8a") // 0,err
-cvt.IntE([]int{}) // 0,err
-
-// alias type
-type OrderType uint8
-cvt.Int(OrderType(3)) // 3
-
-var po OrderType = 3
-cvt.Int(&po) // 3
-
-cvt.IntP("12") // (*int)(0x140000a4180)(12)
-```
-
-> more case see [int_test.go](int_test.go)
-
-
-### string
-- String
-- StringE
-- StringP
-
-```go
-cvt.String(uint(8)) // "8"
-cvt.String(float32(8.31)) // "8.31"
-cvt.String(true) // "true"
-cvt.String([]byte("-8.01")) // "-8.01"
-cvt.String(nil) // ""
-
-cvt.String(errors.New("error info")) // "error info"
-cvt.String(time.Friday) // "Friday"
-cvt.String(big.NewInt(123)) // "123"
-cvt.String(template.URL("https://host.foo")) // "https://host.foo"
-cvt.String(template.HTML("")) // ""
-cvt.String(json.Number("12.34")) // "12.34"
-
-// custom type
-type TestMarshalJSON struct{}
-
-func (TestMarshalJSON) MarshalJSON() ([]byte, error) {
- return []byte("custom marshal"), nil
-}
-cvt.String(TestMarshalJSON{}) // "custom marshal"
-cvt.String(&TestMarshalJSON{}) // "custom marshal"
-
-cvt.StringP(8.31) // (*string)(0x14000110320)((len=3) "123")
-```
-
-> more case see [string_test.go](string_test.go)
-
-
-### float
-- Float32
-- Float32E
-- Float32P
-- Float64
-- Float64E
-- Float64P
-
-```go
-cvt.Float64(int32(8)) // 8
-cvt.Float64(float32(8.31)) // 8.31
-cvt.Float64("-8") // 8
-cvt.Float64("-8.01") // 8.01
-cvt.Float64(nil) // 0
-cvt.Float64(true) // 1
-cvt.Float64(false) // 0
-
-type AliasTypeInt int
-type PointerTypeInt *AliasTypeInt
-cvt.Float64(AliasTypeInt(8)) // 8
-cvt.Float64((*AliasTypeInt)(nil)) // 0
-cvt.FLoat64((*PointerTypeInt)(nil)) // 0
-
-cvt.Float64P("12.3") // (*float64)(0x14000126180)(12.3)
-```
-
-> more case see [float_test.go](float_test.go)
-
-### time
-- Time
-- TimeE
-
-```go
-cvt.Time("2009-11-10 23:00:00 +0000 UTC")
-cvt.Time("2018-10-21T23:21:29+0200")
-cvt.Time("10 Nov 09 23:00 UTC")
-cvt.Time("2009-11-10T23:00:00Z")
-cvt.Time("11:00PM")
-cvt.Time("2006-01-02")
-cvt.Time("2016-03-06 15:28:01")
-cvt.Time(1482597504)
-cvt.Time(time.Date(2009, 2, 13, 23, 31, 30, 0, time.Local))
-```
-
-> more case see [time_test.go](time_test.go)
-
-### slice
-- `ColumnsE`: the values from a single column in the input array/slice/map of struct/map, `[]interface{}`
-
-```go
-// []interface{}{"D1", "D2", nil}
-cvt.ColumnsE([]map[string]interface{}{
- {"1": 111, "DDD": "D1"},
- {"2": 222, "DDD": "D2"},
- {"DDD": nil},
-}, "DDD")
-
-// test type
-type TestStructD struct {
- D1 int
-}
-type TestStructE struct {
- D1 int
- DD *TestStructD
-}
-
-// []interface{}{11, 22}
-cvt.ColumnsE(map[int]TestStructD{1: {11}, 2: {22}}, "D1")
-
-// []interface{}{1, 2}
-cvt.ColumnsE([]TestStructE{{D1: 1}, {D1: 2}}, "D1")
-```
-
-- `FieldE`: the field value from map/struct, `interface{}`
-
-```go
-// map
-cvt.FieldE(map[int]interface{}{123: "112233"}, "123") // "112233"
-cvt.FieldE(map[string]interface{}{"123": "112233"}, "123") // "112233"
-
-// struct
-cvt.FieldE(struct{
- A string
- B int
-}{"Hello", 18}, "A") // "Hello"
-cvt.FieldE(struct{
- A string
- B int
-}{"Hello", 18}, "B") // 18
-```
-
-- `KeysE`: the keys of map, or fields of struct, `[]interface{}`
-
-```go
-cvt.KeysE()
-// key of map
-cvt.KeysE(map[float64]float64{0.1: -0.1, -1.2: 1.2}) // []interface{}{-1.2, 0.1}
-cvt.KeysE(map[string]interface{}{"A": 1, "2": 2}) // []interface{}{"2", "A"}
-cvt.KeysE(map[int]map[string]interface{}{1: {"1": 111, "DDD": 12.3}, -2: {"2": 222, "DDD": "321"}, 3: {"DDD": nil}}) // []interface{}{-2, 1, 3}
-
-// field name of struct
-cvt.KeysE(struct{
- A string
- B int
- C float
-}{}) // []interface{}{"A", "B", "C"}
-
-type TestStructB {
- B int
-}
-cvt.KeysE(struct{
- A string
- TestStructB
- C float
-}{}) // []interface{}{"A", "B", "C"}
-```
-
-- `Slice` / `SliceE`: convert an interface to a `[]interface{}` type
-- `SliceIntE`: convert an interface to a `[]int` type
-- `SliceInt64E`: convert an interface to a `[]int64` type
-- `SliceFloat64E`: convert an interface to a `[]float64` type
-- `SliceStringE`: convert an interface to a `[]string` type
-
-```go
-cvt.SliceE("hello") // []interface{}{'h', 'e', 'l', 'l', 'o'}
-cvt.SliceE([]byte("hey")) // []interface{}{byte('h'), byte('e'), byte('y')}
-cvt.SliceE([]int{1, 2, 3}) // []interface{}{1, 2, 3}
-cvt.SliceE([]string{"a", "b", "c"}) // []interface{}{"a", "b", "c"}
-cvt.SliceE(map[int]string{1: "111", 2: "222"}) // []interface{}{"111", "222"}
-
-// struct values
-type TestStruct struct {
- A int
- B string
-}
-cvt.SliceE(TestStruct{18,"jhon"}) // []interface{}{18, "jhon"}
-
-// SliceIntE
-cvt.SliceIntE([]string{"1", "2", "3"}) // []int{1, 2, 3}
-cvt.SliceIntE(map[int]string{2: "222", 1: "111"}) // []int{111, 222}
-
-// SliceStringE
-cvt.SliceStringE([]float64{1.1, 2.2, 3.0}) // []string{"1.1", "2.2", "3"}
-cvt.SliceStringE(map[int]string{2: "222", 1: "11.1"}) // []string{"11.1", "222"}
-```
-
-> more case see [slice_test.go](slice_test.go)
-
-
-### map
-- StringMapE
-
-```go
-// JSON
-// expect: map[string]interface{}{"name": "cvt", "age": 3.21}
-cvt.StringMapE(`{"name":"cvt","age":3.21}`)
-
-// Map
-// expect: map[string]interface{}{"111": "cvt", "222": 3.21}
-cvt.StringMapE(map[interface{}]interface{}{111: "cvt", "222": 3.21})
-
-// Struct
-// expect: map[string]interface{}{"Name": "cvt", "Age": 3}
-cvt.StringMapE(struct {
- Name string
- Age int
-}{"cvt", 3})
-```
-
-> more case see [map_test.go](map_test.go)
+## Documents
+https://cvt.shockerli.net
## License
diff --git a/README_ZH.md b/README_ZH.md
index cebb681..f888d00 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -66,306 +66,9 @@ cvt.Float("hello", 12.34) // 12.34
> 上千个单元测试用例,覆盖率近100%,所有示例可通过单元测试了解:`*_test.go`
-## API
-
-### bool
-- Bool
-
-```go
-cvt.Bool(0) // false
-cvt.Bool(nil) // false
-cvt.Bool("0") // false
-cvt.Bool("false") // false
-cvt.Bool([]int{}) // false
-
-cvt.Bool(true) // true
-cvt.Bool("true") // true
-cvt.Bool([]int{1, 2}) // true
-cvt.Bool([]byte("true")) // true
-```
-
-- BoolE
-
-```go
-cvt.BoolE(0) // false,nil
-cvt.BoolE(nil) // false,nil
-cvt.BoolE("0") // false,nil
-cvt.BoolE("false") // false,nil
-cvt.BoolE([]int{}) // false,nil
-
-cvt.BoolE(true) // true,nil
-cvt.BoolE("true") // true,nil
-cvt.BoolE([]int{1, 2}) // true,nil
-cvt.BoolE([]byte("true")) // true,nil
-```
-
-- BoolP
-```go
-cvt.BoolP("true") // (*bool)(0x14000126180)(true)
-```
-
-> 更多示例: [bool_test.go](bool_test.go)
-
-
-### int
-- Int
-- IntE
-- IntP
-- Int8
-- Int8E
-- Int8P
-- Int16
-- Int16E
-- Int16P
-- Int32
-- Int32E
-- Int32P
-- Int64
-- Int64E
-- Int64P
-- Uint
-- UintE
-- UintP
-- Uint8
-- Uint8E
-- Uint8P
-- Uint16
-- Uint16E
-- Uint16P
-- Uint32
-- Uint32E
-- Uint32P
-- Uint64
-- Uint64E
-- Uint64P
-
-```go
-cvt.Int(int8(8)) // 8
-cvt.Int(int32(8)) // 8
-cvt.Int("-8.01") // -8
-cvt.Int([]byte("8.00")) // 8
-cvt.Int(nil) // 0
-cvt.IntE("8a") // 0,err
-cvt.IntE([]int{}) // 0,err
-
-// alias type
-type OrderType uint8
-cvt.Int(OrderType(3)) // 3
-
-var po OrderType = 3
-cvt.Int(&po) // 3
-
-cvt.IntP("12") // (*int)(0x140000a4180)(12)
-```
-
-> 更多示例: [int_test.go](int_test.go)
-
-
-### string
-- String
-- StringE
-- StringP
-
-```go
-cvt.String(uint(8)) // "8"
-cvt.String(float32(8.31)) // "8.31"
-cvt.String(true) // "true"
-cvt.String([]byte("-8.01")) // "-8.01"
-cvt.String(nil) // ""
-
-cvt.String(errors.New("error info")) // "error info"
-cvt.String(time.Friday) // "Friday"
-cvt.String(big.NewInt(123)) // "123"
-cvt.String(template.URL("https://host.foo")) // "https://host.foo"
-cvt.String(template.HTML("")) // ""
-cvt.String(json.Number("12.34")) // "12.34"
-
-// custom type
-type TestMarshalJSON struct{}
-
-func (TestMarshalJSON) MarshalJSON() ([]byte, error) {
- return []byte("custom marshal"), nil
-}
-cvt.String(TestMarshalJSON{}) // "custom marshal"
-cvt.String(&TestMarshalJSON{}) // "custom marshal"
-
-cvt.StringP(8.31) // (*string)(0x14000110320)((len=3) "123")
-```
-
-> 更多示例: [string_test.go](string_test.go)
-
-
-### float
-- Float32
-- Float32E
-- Float32P
-- Float64
-- Float64E
-- Float64P
-
-```go
-cvt.Float64(int32(8)) // 8
-cvt.Float64(float32(8.31)) // 8.31
-cvt.Float64("-8") // 8
-cvt.Float64("-8.01") // 8.01
-cvt.Float64(nil) // 0
-cvt.Float64(true) // 1
-cvt.Float64(false) // 0
-
-type AliasTypeInt int
-type PointerTypeInt *AliasTypeInt
-cvt.Float64(AliasTypeInt(8)) // 8
-cvt.Float64((*AliasTypeInt)(nil)) // 0
-cvt.FLoat64((*PointerTypeInt)(nil)) // 0
-
-cvt.Float64P("12.3") // (*float64)(0x14000126180)(12.3)
-```
-
-> 更多示例: [float_test.go](float_test.go)
-
-### time
-- Time
-- TimeE
-
-```go
-cvt.Time("2009-11-10 23:00:00 +0000 UTC")
-cvt.Time("2018-10-21T23:21:29+0200")
-cvt.Time("10 Nov 09 23:00 UTC")
-cvt.Time("2009-11-10T23:00:00Z")
-cvt.Time("11:00PM")
-cvt.Time("2006-01-02")
-cvt.Time("2016-03-06 15:28:01")
-cvt.Time(1482597504)
-cvt.Time(time.Date(2009, 2, 13, 23, 31, 30, 0, time.Local))
-```
-
-> 更多示例: [time_test.go](time_test.go)
-
-### slice
-- `ColumnsE`: 类似于 PHP 中的 `array_column`,`FieldE` 函数的切片版本,返回 `[]interface{}`
-
-```go
-// []interface{}{"D1", "D2", nil}
-cvt.ColumnsE([]map[string]interface{}{
- {"1": 111, "DDD": "D1"},
- {"2": 222, "DDD": "D2"},
- {"DDD": nil},
-}, "DDD")
-
-// test type
-type TestStructD struct {
- D1 int
-}
-type TestStructE struct {
- D1 int
- DD *TestStructD
-}
-
-// []interface{}{11, 22}
-cvt.ColumnsE(map[int]TestStructD{1: {11}, 2: {22}}, "D1")
-
-// []interface{}{1, 2}
-cvt.ColumnsE([]TestStructE{{D1: 1}, {D1: 2}}, "D1")
-```
-
-- `FieldE`: 取 `map` 或 `struct` 的字段值,返回 `interface{}`
-
-```go
-// map
-cvt.FieldE(map[int]interface{}{123: "112233"}, "123") // "112233"
-cvt.FieldE(map[string]interface{}{"123": "112233"}, "123") // "112233"
-
-// struct
-cvt.FieldE(struct{
- A string
- B int
-}{"Hello", 18}, "A") // "Hello"
-cvt.FieldE(struct{
- A string
- B int
-}{"Hello", 18}, "B") // 18
-```
-
-- `KeysE`: 取 `map` 的键名,或结构体的字段名,返回 `[]interface{}`
-
-```go
-cvt.KeysE()
-// key of map
-cvt.KeysE(map[float64]float64{0.1: -0.1, -1.2: 1.2}) // []interface{}{-1.2, 0.1}
-cvt.KeysE(map[string]interface{}{"A": 1, "2": 2}) // []interface{}{"2", "A"}
-cvt.KeysE(map[int]map[string]interface{}{1: {"1": 111, "DDD": 12.3}, -2: {"2": 222, "DDD": "321"}, 3: {"DDD": nil}}) // []interface{}{-2, 1, 3}
-
-// field name of struct
-cvt.KeysE(struct{
- A string
- B int
- C float
-}{}) // []interface{}{"A", "B", "C"}
-
-type TestStructB {
- B int
-}
-cvt.KeysE(struct{
- A string
- TestStructB
- C float
-}{}) // []interface{}{"A", "B", "C"}
-```
-
-- `Slice` / `SliceE`: 转换成 `[]interface{}`
-- `SliceIntE`: 转换成 `[]int`
-- `SliceInt64E`: 转换成 `[]int64`
-- `SliceFloat64E`: 转换成 `[]float64`
-- `SliceStringE`: 转换成 `[]string`
-
-```go
-cvt.SliceE("hello") // []interface{}{'h', 'e', 'l', 'l', 'o'}
-cvt.SliceE([]byte("hey")) // []interface{}{byte('h'), byte('e'), byte('y')}
-cvt.SliceE([]int{1, 2, 3}) // []interface{}{1, 2, 3}
-cvt.SliceE([]string{"a", "b", "c"}) // []interface{}{"a", "b", "c"}
-cvt.SliceE(map[int]string{1: "111", 2: "222"}) // []interface{}{"111", "222"}
-
-// struct values
-type TestStruct struct {
- A int
- B string
-}
-cvt.SliceE(TestStruct{18,"jhon"}) // []interface{}{18, "jhon"}
-
-// SliceIntE
-cvt.SliceIntE([]string{"1", "2", "3"}) // []int{1, 2, 3}
-cvt.SliceIntE(map[int]string{2: "222", 1: "111"}) // []int{111, 222}
-
-// SliceStringE
-cvt.SliceStringE([]float64{1.1, 2.2, 3.0}) // []string{"1.1", "2.2", "3"}
-cvt.SliceStringE(map[int]string{2: "222", 1: "11.1"}) // []string{"11.1", "222"}
-```
-
-> 更多示例: [slice_test.go](slice_test.go)
-
-
-### map
-- StringMapE
-
-```go
-// JSON
-// expect: map[string]interface{}{"name": "cvt", "age": 3.21}
-cvt.StringMapE(`{"name":"cvt","age":3.21}`)
-
-// Map
-// expect: map[string]interface{}{"111": "cvt", "222": 3.21}
-cvt.StringMapE(map[interface{}]interface{}{111: "cvt", "222": 3.21})
-
-// Struct
-// expect: map[string]interface{}{"Name": "cvt", "Age": 3}
-cvt.StringMapE(struct {
- Name string
- Age int
-}{"cvt", 3})
-```
-
-> 更多示例: [map_test.go](map_test.go)
+## 帮助文档
+https://cvt.shockerli.net
## 开源协议
diff --git a/doc/themes/hugo-geekdoc/i18n/en.yaml b/doc/themes/hugo-geekdoc/i18n/en.yaml
index 1807dc8..af6b534 100644
--- a/doc/themes/hugo-geekdoc/i18n/en.yaml
+++ b/doc/themes/hugo-geekdoc/i18n/en.yaml
@@ -35,8 +35,8 @@ posts_count:
posts_tagged_with: All posts tagged with '{{ . }}'
footer_build_with: >
- Built with and
-
+
+
footer_legal_notice: Legal Notice
footer_privacy_policy: Privacy Policy
footer_content_license_prefix: >
diff --git a/doc/themes/hugo-geekdoc/i18n/zh-cn.yaml b/doc/themes/hugo-geekdoc/i18n/zh-cn.yaml
index efbb14d..936ec34 100644
--- a/doc/themes/hugo-geekdoc/i18n/zh-cn.yaml
+++ b/doc/themes/hugo-geekdoc/i18n/zh-cn.yaml
@@ -35,8 +35,7 @@ posts_count:
posts_tagged_with: 所有带有“{{ . }}”标签的帖子。
footer_build_with: >
- 基于
- 制作
+
footer_legal_notice: "法律声明"
footer_privacy_policy: "隐私政策"