sách gpt4 ai đã đi

Giao diện Go Sử dụng giao diện trong định nghĩa

In lại Tác giả: IT Prince Thời gian cập nhật: 2023-10-29 00:40:57 29 4
mua khóa gpt4 Nike

Tôi đang cố gắng tạo một đống Fibonacci. (Chúng được đề cập nhiều lần trong lớp thuật toán mà tôi đang học và tôi muốn kiểm tra lại.) Tôi muốn heap hoạt động với bất kỳ loại nút nào, vì vậy tôi định nghĩa một giao diện Nút:

nút gói

loại giao diện Node {
AddChild(Nút khác)
Less(Node khác) bool
}

loại NodeList []Node

func (n NodeList) AddNode(một Node) {
n = thêm vào(n, a)
}

(Tôi đã sử dụng mảng []Node vì nó có tác dụng tương tự như định nghĩa heap.) Như bạn có thể thấy, giao diện Node định nghĩa hai hàm của nó với các tham số có kiểu Node. Điều này có nghĩa là hàm phải chấp nhận một đối số triển khai giao diện Node. Phần còn lại của heap sử dụng các nút này.

Trong chương trình sử dụng heap này, tôi đã tạo một kiểu triển khai giao diện Node:

gói chính

nhập "container/list"
nhập nút "./node"

Kiểu phần tử struct {
Trẻ em *list.List
Giá trị int
}

func (e Phần tử) AddChild(f Phần tử) {
e.Trẻ em.Đẩy lùi(f)
}

func (e Phần tử) Less(f Phần tử) bool {
trả về e.Value < f.Value
}

hàm main() {
a := Phần tử{list.New(), 1}

n := new(node.NodeList)
n.AddNode(a)
}

Tuy nhiên, điều này không hiệu quả. Trình biên dịch nhắc nhở Element không có định nghĩa hàm giao diện chính xác.

không thể sử dụng (kiểu Element) làm kiểu node.Node trong đối số hàm:
Phần tử không triển khai node.Node (kiểu sai cho phương thức AddChild)
có AddChild(Phần tử)
muốn AddChild(node.Node)

Vấn đề ở đây là gì? Rõ ràng Element không triển khai giao diện một cách chính xác, nhưng tôi nghĩ đó là do cách tôi định nghĩa giao diện. Có cách chính xác nào để thực hiện những gì tôi muốn làm trong Go không? Giao diện có thể tự tham chiếu đến chính nó không?

1 Câu trả lời

chức năng

func (e Phần tử) Less(f Phần tử) bool

Không phù hợp với chức năng trên giao diện

func Less(Node khác) bool

Bạn thực sự cần phải khớp với chữ ký, chẳng hạn như

func (e Phần tử) Ít hơn (f Nút) bool

Vâng, điều này có nghĩa là bạn có thể vượt qua một Nút Còn hơn là Yếu tố. Bạn phải kiểm tra điều này khi chạy và báo động.


Để lấy ví dụ về lý do tại sao trường hợp này có thể xảy ra và xem xét liệu mã của bạn có hợp pháp hay không, tôi đã thử như sau:

Kiểu int khác
func (o Khác) Less(f Khác) bool {
trả về o < f
}
func (o Khác) AddChild(f Khác) {}
e = GetSomeElement() // thuộc kiểu Element
var o Khác
var n Nút = e
fmt.Println(n.Ít hơn(o))

Bởi vì tôi sẽ Yếu tố Lưu vào Nút loại var, vì vậy bây giờ tôi có thể gọi Ít hơn()khác Yếu tố, vi phạm Phần tử.Less() Kiểu. Đó là lý do tại sao việc làm như vậy là bất hợp pháp.

Về giao diện - Giao diện Go Sử dụng giao diện trong định nghĩa, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/13281191/

29 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com