form
Release 4.2.1
包裝表單將URL.值解碼為GO值,並將GO值編碼為url.values。
它具有以下功能:
"Array[0]"
和僅傳遞了多個值的"Array"
。array
或map
值,則將array
和map
作為結構中的默認值留下。常見問題
array/slice
與array[idx]/slice[idx]
混合,以哪個順序解析? array/slice
然後array[idx]/slice[idx]
string
bool
int
, int8
, int16
, int32
, int64
uint
, uint8
, uint16
, uint32
, uint64
float32
, float64
struct
和anonymous struct
interface{}
time.Time
默認使用RFC3339pointer
slice
, array
map
custom types
可以覆蓋上述任何類型注意: map
, struct
和slice
嵌套是無限的。
使用去。
go get github.com/go-playground/form
然後將表單軟件包導入您自己的代碼。
import "github.com/go-playground/form/v4"
.
用於分離字段/結構。 (例如structfield.field
)[index or key]
訪問切片/數組或鍵的索引索引。 (例如arrayfield[0]
, mapfield[keyvalue]
) < form method =" POST " >
< input type =" text " name =" Name " value =" joeybloggs "/>
< input type =" text " name =" Age " value =" 3 "/>
< input type =" text " name =" Gender " value =" Male "/>
< input type =" text " name =" Address[0].Name " value =" 26 Here Blvd. "/>
< input type =" text " name =" Address[0].Phone " value =" 9(999)999-9999 "/>
< input type =" text " name =" Address[1].Name " value =" 26 There Blvd. "/>
< input type =" text " name =" Address[1].Phone " value =" 1(111)111-1111 "/>
< input type =" text " name =" active " value =" true "/>
< input type =" text " name =" MapExample[key] " value =" value "/>
< input type =" text " name =" NestedMap[key][key] " value =" value "/>
< input type =" text " name =" NestedArray[0][0] " value =" value "/>
< input type =" submit "/>
</ form >
解碼
package main
import (
"fmt"
"log"
"net/url"
"github.com/go-playground/form/v4"
)
// Address contains address information
type Address struct {
Name string
Phone string
}
// User contains user information
type User struct {
Name string
Age uint8
Gender string
Address [] Address
Active bool `form:"active"`
MapExample map [ string ] string
NestedMap map [ string ] map [ string ] string
NestedArray [][] string
}
// use a single instance of Decoder, it caches struct info
var decoder * form. Decoder
func main () {
decoder = form . NewDecoder ()
// this simulates the results of http.Request's ParseForm() function
values := parseForm ()
var user User
// must pass a pointer
err := decoder . Decode ( & user , values )
if err != nil {
log . Panic ( err )
}
fmt . Printf ( "%#v n " , user )
}
// this simulates the results of http.Request's ParseForm() function
func parseForm () url. Values {
return url. Values {
"Name" : [] string { "joeybloggs" },
"Age" : [] string { "3" },
"Gender" : [] string { "Male" },
"Address[0].Name" : [] string { "26 Here Blvd." },
"Address[0].Phone" : [] string { "9(999)999-9999" },
"Address[1].Name" : [] string { "26 There Blvd." },
"Address[1].Phone" : [] string { "1(111)111-1111" },
"active" : [] string { "true" },
"MapExample[key]" : [] string { "value" },
"NestedMap[key][key]" : [] string { "value" },
"NestedArray[0][0]" : [] string { "value" },
}
}
編碼
package main
import (
"fmt"
"log"
"github.com/go-playground/form/v4"
)
// Address contains address information
type Address struct {
Name string
Phone string
}
// User contains user information
type User struct {
Name string
Age uint8
Gender string
Address [] Address
Active bool `form:"active"`
MapExample map [ string ] string
NestedMap map [ string ] map [ string ] string
NestedArray [][] string
}
// use a single instance of Encoder, it caches struct info
var encoder * form. Encoder
func main () {
encoder = form . NewEncoder ()
user := User {
Name : "joeybloggs" ,
Age : 3 ,
Gender : "Male" ,
Address : [] Address {
{ Name : "26 Here Blvd." , Phone : "9(999)999-9999" },
{ Name : "26 There Blvd." , Phone : "1(111)111-1111" },
},
Active : true ,
MapExample : map [ string ] string { "key" : "value" },
NestedMap : map [ string ] map [ string ] string { "key" : { "key" : "value" }},
NestedArray : [][] string {{ "value" }},
}
// must pass a pointer
values , err := encoder . Encode ( & user )
if err != nil {
log . Panic ( err )
}
fmt . Printf ( "%#v n " , values )
}
解碼器
decoder . RegisterCustomTypeFunc ( func ( vals [] string ) ( interface {}, error ) {
return time . Parse ( "2006-01-02" , vals [ 0 ])
}, time. Time {})
另外:如果已註冊結構類型,則僅在url.值為struct而不僅僅是struct字段(例如)時,才會調用該函數。 url.values {“ user”:“ name%3djoeybloggs”}將以'user'的命名將自定義類型函數稱為類型,但是url.values {“ user.name”:“ joeybloggs”}不會。
編碼器
encoder . RegisterCustomTypeFunc ( func ( x interface {}) ([] string , error ) {
return [] string { x .(time. Time ). Format ( "2006-01-02" )}, nil
}, time. Time {})
您可以說出表格以忽略字段-
在標籤中
type MyStruct struct {
Field string `form:"-"`
}
您可以告訴表格以省略使用標籤中的,omitempty
或FieldName,omitempty
空字段
type MyStruct struct {
Field string `form:",omitempty"`
Field2 string `form:"CustomFieldName,omitempty"`
}
為了最大化與其他系統的兼容性,編碼器嘗試避免在URL.VALUE中使用數組索引。
例如。
// A struct field of
Field [] string { "1" , "2" , "3" }
// will be output a url.Value as
"Field" : [] string { "1" , "2" , "3" }
and not
"Field[0]" : [] string { "1" }
"Field[1]" : [] string { "2" }
"Field[2]" : [] string { "3" }
// however there are times where it is unavoidable, like with pointers
i := int ( 1 )
Field [] * string { nil , nil , & i }
// to avoid index 1 and 2 must use index
"Field[2]" : [] string { "1" }
注意:前4個解碼中的1個分配和b/op實際上是分配傳遞時的結構分配,因此原語實際上是零分配。
go test - run = NONE - bench = . - benchmem = true . / ...
goos : darwin
goarch: arm64
pkg: github . com / go - playground / form / v4 / benchmarks
BenchmarkSimpleUserDecodeStruct - 8 8704111 121.1 ns / op 64 B / op 1 allocs / op
BenchmarkSimpleUserDecodeStructParallel - 8 35916134 32.89 ns / op 64 B / op 1 allocs / op
BenchmarkSimpleUserEncodeStruct - 8 3746173 320.7 ns / op 485 B / op 10 allocs / op
BenchmarkSimpleUserEncodeStructParallel - 8 7293147 180.0 ns / op 485 B / op 10 allocs / op
BenchmarkPrimitivesDecodeStructAllPrimitivesTypes - 8 2993259 400.5 ns / op 96 B / op 1 allocs / op
BenchmarkPrimitivesDecodeStructAllPrimitivesTypesParallel - 8 13023300 97.70 ns / op 96 B / op 1 allocs / op
BenchmarkPrimitivesEncodeStructAllPrimitivesTypes - 8 643202 1767 ns / op 2977 B / op 35 allocs / op
BenchmarkPrimitivesEncodeStructAllPrimitivesTypesParallel - 8 1000000 1202 ns / op 2978 B / op 35 allocs / op
BenchmarkComplexArrayDecodeStructAllTypes - 8 172630 6822 ns / op 2008 B / op 121 allocs / op
BenchmarkComplexArrayDecodeStructAllTypesParallel - 8 719788 1735 ns / op 2009 B / op 121 allocs / op
BenchmarkComplexArrayEncodeStructAllTypes - 8 197052 5839 ns / op 7087 B / op 104 allocs / op
BenchmarkComplexArrayEncodeStructAllTypesParallel - 8 348039 3247 ns / op 7089 B / op 104 allocs / op
BenchmarkComplexMapDecodeStructAllTypes - 8 139246 8550 ns / op 5313 B / op 130 allocs / op
BenchmarkComplexMapDecodeStructAllTypesParallel - 8 409018 3143 ns / op 5317 B / op 130 allocs / op
BenchmarkComplexMapEncodeStructAllTypes - 8 208833 5515 ns / op 4257 B / op 103 allocs / op
BenchmarkComplexMapEncodeStructAllTypesParallel - 8 523833 2182 ns / op 4258 B / op 103 allocs / op
BenchmarkDecodeNestedStruct - 8 807690 1408 ns / op 344 B / op 14 allocs / op
BenchmarkDecodeNestedStructParallel - 8 3409441 359.6 ns / op 344 B / op 14 allocs / op
BenchmarkEncodeNestedStruct - 8 1488520 803.6 ns / op 653 B / op 16 allocs / op
BenchmarkEncodeNestedStructParallel - 8 3570204 346.6 ns / op 653 B / op 16 allocs / op
競爭對手可以在這裡找到
這是使用此庫帖子解碼來讚美軟件的列表。
根據MIT許可分發,請參閱代碼中的許可證文件以獲取更多詳細信息。