Tôi đang cố gắng nhập khẳng định từ một số []Node
, đến []Symbol
. Trong mã của tôi, Symbol
triển khai giao diện Node
.Tôi có thể gõ khẳng định một lát các giá trị giao diện không?
Dưới đây là một số mã xung quanh:
43 func applyLambda(args []Node, env Env) Node {
44 if len(args) > 2 {
45 panic("invalid argument count")
46 }
47 fixed, rest := parseFormals(args.([]Symbol))
48 return Func{
49 Body: args[1],
50 FixedVarNames: fixed,
51 RestVarName: rest,
52 }
53 }
Đây là lỗi tôi nhận được:
./builtins.go:47: invalid type assertion: args.([]Symbol) (non-interface type []Node on left)
tôi chắc chắn rằng có một lý do chính đáng cho việc này. Cách tốt nhất để tiến hành là gì?
Tôi không đồng ý với tình cảm của bạn "Vì vậy, nó chỉ không có ý nghĩa để giả định một lát giá trị giao diện là một giao diện quá". Chuyển đổi là chuyển đổi - giao diện là giao diện. Chúng là những khái niệm riêng biệt (ít nhất là trong tâm trí của tôi). Các tác giả có thể quyết định hỗ trợ chuyển đổi từ '[] Node' thành' [] Symbol', nhưng chúng không phải vì nó quá tốn kém và các chuyển đổi như vậy không phải là một mẫu lập trình chung. Về mặt lý thuyết, bất kỳ chuyển đổi nào không đòi hỏi sự mâu thuẫn cũng không phải là một vấn đề có ý nghĩa - nhưng các nhà thiết kế ngôn ngữ cần phải chọn chuyển đổi để đưa vào ngôn ngữ. –
Tôi không thể nói chắc chắn những gì tác giả Go nghĩ về vấn đề này, nhưng tôi vẫn nghĩ rằng giả định của tôi là sự thật. Bạn đúng rằng chuyển đổi này quá tốn kém, nhưng tôi không nghĩ đó là lý do khiến việc đó trở thành bất hợp pháp. Như tôi đã nói, trong Go slice là một kiểu. Bạn có thể nói 'type Nodes [] Node'. 'Nodes' có phải là loại giao diện không? Vì vậy, tôi thấy đó là lý do chúng tôi không thể xác nhận các biến kiểu '[] Node'. Bạn có muốn thực hiện cuộc thảo luận này trên danh sách gửi thư golang-hạt không? – Mostafa
@Atom: Câu hỏi không hỏi về chuyển đổi; nó hỏi về xác nhận kiểu – newacct