คำถามติดแท็ก go-reflect

14
จะค้นหาประเภทของวัตถุใน Go ได้อย่างไร?
ฉันจะค้นหาประเภทของวัตถุใน Go ได้อย่างไร ใน Python ฉันใช้typeofเพื่อดึงข้อมูลประเภทของวัตถุ ในทำนองเดียวกันใน Go มีวิธีดำเนินการเหมือนกันหรือไม่ นี่คือคอนเทนเนอร์ที่ฉันกำลังวนซ้ำ: for e := dlist.Front(); e != nil; e = e.Next() { lines := e.Value fmt.Printf(reflect.TypeOf(lines)) } ฉันไม่สามารถรับชนิดของวัตถุในกรณีนี้ซึ่งเป็นอาร์เรย์ของสตริง
387 go  go-reflect 


6
พิมพ์การแปลงส่วนของอินเทอร์เฟซ
ฉันอยากรู้ว่าทำไมไปโดยปริยายกวนแปลง[]Tไป[]interface{}เมื่อมันโดยปริยายจะแปลงไปT interface{}มีบางอย่างที่ไม่สำคัญกับการแปลงนี้ที่ฉันขาดไปหรือไม่? ตัวอย่าง: func foo([]interface{}) { /* do something */ } func main() { var a []string = []string{"hello", "world"} foo(a) } go build บ่น ไม่สามารถใช้สตริง (ประเภท []) เป็นประเภท [] อินเตอร์เฟส {} ในอาร์กิวเมนต์ของฟังก์ชัน และถ้าฉันพยายามทำมันอย่างชัดเจนสิ่งเดียวกัน: b := []interface{}(a)บ่น ไม่สามารถแปลงสตริง (พิมพ์ []) เป็นพิมพ์ [] อินเตอร์เฟส {} ดังนั้นทุกครั้งที่ฉันจำเป็นต้องทำการแปลงนี้ (ซึ่งดูเหมือนจะเกิดขึ้นมาก) ฉันได้ทำสิ่งนี้: b = make([]interface{}, …

5
จะเปรียบเทียบได้อย่างไรว่าโครงสร้างสองชิ้นหรือแผนที่เท่ากันหรือไม่?
ฉันต้องการตรวจสอบว่าโครงสร้างสองส่วนและแผนที่เท่ากันหรือไม่ แต่ฉันพบปัญหากับรหัสต่อไปนี้ ดูความคิดเห็นของฉันที่บรรทัดที่เกี่ยวข้อง package main import ( "fmt" "reflect" ) type T struct { X int Y string Z []int M map[string]int } func main() { t1 := T{ X: 1, Y: "lei", Z: []int{1, 2, 3}, M: map[string]int{ "a": 1, "b": 2, }, } t2 := T{ X: 1, …
132 go  go-reflect 

3
วนซ้ำในฟิลด์ของโครงสร้างใน Go
โดยพื้นฐานแล้ววิธีเดียว (ที่ฉันรู้) ในการวนซ้ำผ่านค่าของฟิลด์ของ a structเป็นดังนี้: type Example struct { a_number uint32 a_string string } //... r := &Example{(2 << 31) - 1, "...."}: for _, d:= range []interface{}{ r.a_number, r.a_string, } { //do something with the d } ฉันสงสัยว่ามีวิธีที่ดีกว่าและหลากหลายกว่าในการบรรลุผล[]interface{}{ r.a_number, r.a_string, }หรือไม่ดังนั้นฉันจึงไม่จำเป็นต้องแสดงรายการพารามิเตอร์แต่ละรายการทีละรายการหรือมีวิธีที่ดีกว่าในการวนซ้ำโครงสร้างหรือไม่ ฉันพยายามมองผ่านreflectแพ็คเกจ แต่ฉันชนกำแพงเพราะฉันไม่แน่ใจว่าจะทำอย่างไรเมื่อฉันดึงข้อมูลออกreflect.ValueOf(*r).Field(0)มา ขอบคุณ!
108 go  go-reflect 

2
การใช้การสะท้อนคุณกำหนดค่าของฟิลด์โครงสร้างอย่างไร
มีเวลาคร่าวๆในการทำงานกับฟิลด์โครงสร้างโดยใช้reflectแพ็คเกจ โดยเฉพาะอย่างยิ่งยังไม่ได้หาวิธีตั้งค่าฟิลด์ พิมพ์ t struct {fi int; fs string} var rt = เสื้อ {123, "jblow"} var i64 int64 = 456 รับชื่อฟิลด์ i - ดูเหมือนจะใช้ได้ var field = reflect.TypeOf(r).Field(i).Name รับค่าของฟิลด์ i เป็น a) อินเทอร์เฟซ {}, b) int - ดูเหมือนจะใช้ได้ var iface interface{} = reflect.ValueOf(r).Field(i).Interface() var i int = int(reflect.ValueOf(r).Field(i).Int()) การตั้งค่าของฟิลด์ฉัน - …

2
จะรับชื่อฟังก์ชันใน Go ได้อย่างไร?
ด้วยฟังก์ชั่นเป็นไปได้ที่จะได้รับชื่อหรือไม่? พูด: func foo() { } func GetFunctionName(i interface{}) string { // ... } func main() { // Will print "name: foo" fmt.Println("name:", GetFunctionName(foo)) } ฉันได้รับแจ้งว่าruntime FuncForPCจะช่วยได้ แต่ฉันไม่เข้าใจวิธีการใช้งาน

3
ช่วงบนอินเทอร์เฟซ {} ซึ่งจัดเก็บชิ้นส่วน
t interface{}รับสถานการณ์ที่คุณมีฟังก์ชั่นที่ยอมรับ หากพิจารณาแล้วว่าtเป็นชิ้นฉันจะทำrangeอย่างไร func main() { data := []string{"one","two","three"} test(data) moredata := []int{1,2,3} test(data) } func test(t interface{}) { switch reflect.TypeOf(t).Kind() { case reflect.Slice: // how do I iterate here? for _,value := range t { fmt.Println(value) } } } ไปที่ Playground ตัวอย่าง: http://play.golang.org/p/DNldAlNShB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.