structure: add Fields() function, closes #4
This commit is contained in:
parent
afdeeccc8b
commit
2d4d14a6c8
18
README.md
18
README.md
@ -28,7 +28,7 @@ s := &Server{
|
|||||||
|
|
||||||
#### ToMap()
|
#### ToMap()
|
||||||
|
|
||||||
Convert to a `map[string]interface{}`
|
Convert a struct to a `map[string]interface{}`
|
||||||
|
|
||||||
```go
|
```go
|
||||||
m := structure.ToMap(s)
|
m := structure.ToMap(s)
|
||||||
@ -39,8 +39,8 @@ fmt.Printf("%#v", m)
|
|||||||
|
|
||||||
#### ToSlice()
|
#### ToSlice()
|
||||||
|
|
||||||
Convert to a `[]interface{}`. Slice values are **sorted** by default according
|
Convert the values of a struct to a `[]interface{}`. Slice values are
|
||||||
to the field names.
|
**sorted** by default according to the field names.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
m := structure.ToSlice(s)
|
m := structure.ToSlice(s)
|
||||||
@ -49,6 +49,18 @@ m := structure.ToSlice(s)
|
|||||||
fmt.Printf("%#v", m)
|
fmt.Printf("%#v", m)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Fields()
|
||||||
|
|
||||||
|
Convert the fields of a struct to a `[]string`. Slice values are **sorted** by
|
||||||
|
default according to the field names.
|
||||||
|
|
||||||
|
```go
|
||||||
|
m := structure.Fields(s)
|
||||||
|
|
||||||
|
// prints: []string{"Enabled", "ID", "Name"}
|
||||||
|
fmt.Printf("%#v", m)
|
||||||
|
```
|
||||||
|
|
||||||
#### IsStruct()
|
#### IsStruct()
|
||||||
|
|
||||||
Check if it's a struct or a pointer to struct
|
Check if it's a struct or a pointer to struct
|
||||||
|
|||||||
@ -74,7 +74,8 @@ func ToSlice(s interface{}) []interface{} {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fields returns a sorted slice of field names.
|
// Fields returns a sorted slice of field names. Note that only exported
|
||||||
|
// fields of a struct can be accessed, non exported fields will be neglected.
|
||||||
func Fields(s interface{}) []string {
|
func Fields(s interface{}) []string {
|
||||||
m := ToMap(s)
|
m := ToMap(s)
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
package structure
|
package structure
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
func ExampleToMap() {
|
func ExampleToMap() {
|
||||||
type Server struct {
|
type Server struct {
|
||||||
@ -73,3 +76,24 @@ func ExampleToSlice() {
|
|||||||
// Output:
|
// Output:
|
||||||
// []interface {}{false, 135790, "Fatih"}
|
// []interface {}{false, 135790, "Fatih"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleFields() {
|
||||||
|
type Access struct {
|
||||||
|
Name string
|
||||||
|
LastAccessed time.Time
|
||||||
|
Number int
|
||||||
|
}
|
||||||
|
|
||||||
|
s := &Access{
|
||||||
|
Name: "Fatih",
|
||||||
|
LastAccessed: time.Now(),
|
||||||
|
Number: 1234567,
|
||||||
|
}
|
||||||
|
|
||||||
|
m := Fields(s)
|
||||||
|
|
||||||
|
// note that the output is sorted according to the field names
|
||||||
|
fmt.Printf("%#v\n", m)
|
||||||
|
// Output:
|
||||||
|
// []string{"LastAccessed", "Name", "Number"}
|
||||||
|
}
|
||||||
|
|||||||
@ -115,6 +115,10 @@ func TestToSlice(t *testing.T) {
|
|||||||
|
|
||||||
s := ToSlice(T)
|
s := ToSlice(T)
|
||||||
|
|
||||||
|
if typ := reflect.TypeOf(s).Kind(); typ != reflect.Slice {
|
||||||
|
t.Errorf("ToSlice should return a slice type, got: %v", typ)
|
||||||
|
}
|
||||||
|
|
||||||
inSlice := func(val interface{}) bool {
|
inSlice := func(val interface{}) bool {
|
||||||
for _, v := range s {
|
for _, v := range s {
|
||||||
if reflect.DeepEqual(v, val) {
|
if reflect.DeepEqual(v, val) {
|
||||||
@ -130,3 +134,36 @@ func TestToSlice(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFields(t *testing.T) {
|
||||||
|
var T = struct {
|
||||||
|
A string
|
||||||
|
B int
|
||||||
|
C bool
|
||||||
|
}{
|
||||||
|
A: "a-value",
|
||||||
|
B: 2,
|
||||||
|
C: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
s := Fields(T)
|
||||||
|
|
||||||
|
if len(s) != 3 {
|
||||||
|
t.Errorf("Fields should return a slice of len 3, got: %d", len(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
inSlice := func(val string) bool {
|
||||||
|
for _, v := range s {
|
||||||
|
if reflect.DeepEqual(v, val) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, val := range []string{"A", "B", "C"} {
|
||||||
|
if !inSlice(val) {
|
||||||
|
t.Errorf("Fields should have the value %v", val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user