คำสั่งเงื่อนไขที่ซับซ้อนใน golang

ฉันเพิ่งเริ่มเรียน golang และ Revel ฉันกำลังพยายามทำความเข้าใจว่าข้อความด้านล่างนี้เป็นอย่างไร ดูเหมือนว่ากำลังทำการตรวจสอบประเภท แต่ฉันไม่เห็นว่าเงื่อนไขบรรลุผลอะไร ขอขอบคุณถ้าใครสามารถบอกฉันว่าเกิดอะไรขึ้นที่นี่ ขอบคุณ

if str, ok := obj.(string); ok {
return len(str) > 0
}

person broun    schedule 08.06.2014    source แหล่งที่มา


คำตอบ (2)


มันพยายามแปลง obj (ซึ่งอาจเป็นอินเทอร์เฟซแบบนามธรรม) ให้เป็นสตริง ตรวจสอบว่าใช้งานได้หรือไม่ และจะเข้าเฉพาะในกรณีที่ได้ผลดีเท่านั้น

เขียนแบบกระจัดกระจายมากขึ้นสามารถดูได้ดังนี้:

// do a type assertion/conversion of obj to a string. 
// If obj isn't really a string, ok will be false
str, ok := obj.(string) 

// this will only run if we're talking about a string
if ok {
 return len(str) > 0
}

สิ่งที่ไปคือการแคสต์อย่างปลอดภัยจากอินเทอร์เฟซบางส่วนไปเป็นประเภทจริง หากคุณทำเช่นนี้โดยไม่มีส่วน ok โปรแกรมของคุณจะตื่นตระหนกหาก obj ไม่ใช่สตริง นั่นคือรหัสนี้จะทำให้โปรแกรมของคุณเสียหายหาก obj ไม่ใช่สตริง:

str := obj.(string) 
return len(str) > 0   

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการยืนยันประเภทได้ในเอกสาร:

http://golang.org/ref/spec#Type_assertions

person Not_a_Golfer    schedule 08.06.2014
comment
อ่า!! สมเหตุสมผล ขอบคุณสำหรับการตอบกลับที่รวดเร็ว - person broun; 09.06.2014

สิ่งนี้เรียกว่าการยืนยันประเภท ตัวแปร obj ของคุณคือ interface{} กล่าวอีกนัยหนึ่ง ประเภทที่แท้จริงของตัวแปรสามารถเปลี่ยนจากการดำเนินการหนึ่งไปยังอีกการดำเนินการหนึ่งได้ การยืนยันประเภทใช้เพื่อกำหนดประเภทที่แท้จริงของ interface{} มีสองวิธีในการดำเนินการดังกล่าว:

str = obj.(string)

อันนี้ไม่ปลอดภัย: หาก obj ไม่ใช่ string โปรแกรมจะตื่นตระหนก อีกอันคืออันที่คุณใช้ในโค้ดของคุณ ถ้า obj ไม่ใช่ string ok บูลีนจะเป็น false

ตัวอย่างเช่น:

func f(v interface{}) {
    if _, ok := v.(string); ok {
        fmt.Println("v is a string!")
    } else if _, ok := v.(float64); ok {
        fmt.Println("v is a float64!")
    } else {
         fmt.Println("v is something else...")
    }
}
f(17.42) // "v is a float64!"
f("foobar") // "v is a string!"
f([]string{"hello", "world"}) // "v is something else..."
person julienc    schedule 08.06.2014
comment
[]interface{} ควรแทนที่ด้วย interface{} ควรใช้ str และ if เช่น fmt.Println(str) และ fmt.Println(if) - person Tom L; 24.04.2020