OXIESEC PANEL
- Current Dir:
/
/
opt
/
golang
/
1.22.0
/
src
/
reflect
Server IP: 2a02:4780:11:1084:0:327f:3464:10
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
abi.go
15.02 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
abi_test.go
26.39 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
all_test.go
214.57 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
arena.go
570 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_386.s
1.07 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_amd64.s
2.76 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_arm.s
1.13 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_arm64.s
2.77 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_loong64.s
2.87 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_mips64x.s
1.16 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_mipsx.s
1.16 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_ppc64x.s
3.31 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_riscv64.s
2.58 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_s390x.s
1.1 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
asm_wasm.s
1.15 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
benchmark_test.go
8.82 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
deepequal.go
7.42 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
example_test.go
4.53 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
export_test.go
3.73 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
float32reg_generic.go
681 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
float32reg_ppc64x.s
838 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
float32reg_riscv64.s
794 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📁
internal
-
02/02/2024 06:09:55 PM
rwxr-xr-x
📄
makefunc.go
5.91 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
nih_test.go
1004 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
set_test.go
5.71 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_ppc64x.go
292 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
stubs_riscv64.go
263 bytes
02/02/2024 06:09:55 PM
rw-r--r--
📄
swapper.go
2 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
tostring_test.go
2.14 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
type.go
80.47 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
type_test.go
1.26 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
value.go
118.95 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
visiblefields.go
2.97 KB
02/02/2024 06:09:55 PM
rw-r--r--
📄
visiblefields_test.go
5.27 KB
02/02/2024 06:09:55 PM
rw-r--r--
Editing: visiblefields_test.go
Close
// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package reflect_test import ( . "reflect" "strings" "testing" ) type structField struct { name string index []int } var fieldsTests = []struct { testName string val any expect []structField }{{ testName: "SimpleStruct", val: struct { A int B string C bool }{}, expect: []structField{{ name: "A", index: []int{0}, }, { name: "B", index: []int{1}, }, { name: "C", index: []int{2}, }}, }, { testName: "NonEmbeddedStructMember", val: struct { A struct { X int } }{}, expect: []structField{{ name: "A", index: []int{0}, }}, }, { testName: "EmbeddedExportedStruct", val: struct { SFG }{}, expect: []structField{{ name: "SFG", index: []int{0}, }, { name: "F", index: []int{0, 0}, }, { name: "G", index: []int{0, 1}, }}, }, { testName: "EmbeddedUnexportedStruct", val: struct { sFG }{}, expect: []structField{{ name: "sFG", index: []int{0}, }, { name: "F", index: []int{0, 0}, }, { name: "G", index: []int{0, 1}, }}, }, { testName: "TwoEmbeddedStructsWithCancelingMembers", val: struct { SFG SF }{}, expect: []structField{{ name: "SFG", index: []int{0}, }, { name: "G", index: []int{0, 1}, }, { name: "SF", index: []int{1}, }}, }, { testName: "EmbeddedStructsWithSameFieldsAtDifferentDepths", val: struct { SFGH3 SG1 SFG2 SF2 L int }{}, expect: []structField{{ name: "SFGH3", index: []int{0}, }, { name: "SFGH2", index: []int{0, 0}, }, { name: "SFGH1", index: []int{0, 0, 0}, }, { name: "SFGH", index: []int{0, 0, 0, 0}, }, { name: "H", index: []int{0, 0, 0, 0, 2}, }, { name: "SG1", index: []int{1}, }, { name: "SG", index: []int{1, 0}, }, { name: "G", index: []int{1, 0, 0}, }, { name: "SFG2", index: []int{2}, }, { name: "SFG1", index: []int{2, 0}, }, { name: "SFG", index: []int{2, 0, 0}, }, { name: "SF2", index: []int{3}, }, { name: "SF1", index: []int{3, 0}, }, { name: "SF", index: []int{3, 0, 0}, }, { name: "L", index: []int{4}, }}, }, { testName: "EmbeddedPointerStruct", val: struct { *SF }{}, expect: []structField{{ name: "SF", index: []int{0}, }, { name: "F", index: []int{0, 0}, }}, }, { testName: "EmbeddedNotAPointer", val: struct { M }{}, expect: []structField{{ name: "M", index: []int{0}, }}, }, { testName: "RecursiveEmbedding", val: Rec1{}, expect: []structField{{ name: "Rec2", index: []int{0}, }, { name: "F", index: []int{0, 0}, }, { name: "Rec1", index: []int{0, 1}, }}, }, { testName: "RecursiveEmbedding2", val: Rec2{}, expect: []structField{{ name: "F", index: []int{0}, }, { name: "Rec1", index: []int{1}, }, { name: "Rec2", index: []int{1, 0}, }}, }, { testName: "RecursiveEmbedding3", val: RS3{}, expect: []structField{{ name: "RS2", index: []int{0}, }, { name: "RS1", index: []int{1}, }, { name: "i", index: []int{1, 0}, }}, }} type SFG struct { F int G int } type SFG1 struct { SFG } type SFG2 struct { SFG1 } type SFGH struct { F int G int H int } type SFGH1 struct { SFGH } type SFGH2 struct { SFGH1 } type SFGH3 struct { SFGH2 } type SF struct { F int } type SF1 struct { SF } type SF2 struct { SF1 } type SG struct { G int } type SG1 struct { SG } type sFG struct { F int G int } type RS1 struct { i int } type RS2 struct { RS1 } type RS3 struct { RS2 RS1 } type M map[string]any type Rec1 struct { *Rec2 } type Rec2 struct { F string *Rec1 } func TestFields(t *testing.T) { for _, test := range fieldsTests { test := test t.Run(test.testName, func(t *testing.T) { typ := TypeOf(test.val) fields := VisibleFields(typ) if got, want := len(fields), len(test.expect); got != want { t.Fatalf("unexpected field count; got %d want %d", got, want) } for j, field := range fields { expect := test.expect[j] t.Logf("field %d: %s", j, expect.name) gotField := typ.FieldByIndex(field.Index) // Unfortunately, FieldByIndex does not return // a field with the same index that we passed in, // so we set it to the expected value so that // it can be compared later with the result of FieldByName. gotField.Index = field.Index expectField := typ.FieldByIndex(expect.index) // ditto. expectField.Index = expect.index if !DeepEqual(gotField, expectField) { t.Fatalf("unexpected field result\ngot %#v\nwant %#v", gotField, expectField) } // Sanity check that we can actually access the field by the // expected name. gotField1, ok := typ.FieldByName(expect.name) if !ok { t.Fatalf("field %q not accessible by name", expect.name) } if !DeepEqual(gotField1, expectField) { t.Fatalf("unexpected FieldByName result; got %#v want %#v", gotField1, expectField) } } }) } } // Must not panic with nil embedded pointer. func TestFieldByIndexErr(t *testing.T) { type A struct { S string } type B struct { *A } v := ValueOf(B{}) _, err := v.FieldByIndexErr([]int{0, 0}) if err == nil { t.Fatal("expected error") } if !strings.Contains(err.Error(), "embedded struct field A") { t.Fatal(err) } }