Tôi đã hỏi câu hỏi này vài tháng trước, khi tôi lần đầu tiên bắt đầu tìm hiểu về cờ vây. Kể từ đó, hàng ngày tôi đều đọc về cờ vây và viết mã trong cờ vây.
Bởi vì tôi không nhận được câu trả lời rõ ràng cho câu hỏi này (mặc dù tôi đã chấp nhận một câu trả lời) Bây giờ tôi sẽ tự trả lời nó, dựa trên những gì tôi đã học được, kể từ khi tôi hỏi nó:
Có cách nào để tạo mảng / lát cắt trong Go mà không có kích thước mảng được mã hóa cứng không?
Đúng. Slices không yêu cầu một mảng được mã hóa cứng để slice
từ:
var sl []int = make([]int,len,cap)
Mã này phân bổ lát cắt sl
, có kích thước len
với dung lượng cap
- len
và cap
là các biến có thể được chỉ định trong thời gian chạy.
Tại sao list.List
bị bỏ qua?
Có vẻ như những lý do chính list.List
dường như ít được chú ý trong cờ vây là:
Như đã được giải thích trong câu trả lời của @Nick Craig-Wood, hầu như không thể thực hiện được gì với các danh sách không thể thực hiện với các lát cắt, thường hiệu quả hơn và với cú pháp gọn gàng, thanh lịch hơn. Ví dụ, cấu trúc phạm vi:
for i:=range sl {
sl[i]=i
}
không thể được sử dụng với danh sách - một kiểu C cho vòng lặp là bắt buộc. Và trong nhiều trường hợp, cú pháp kiểu sưu tập C ++ phải được sử dụng với danh sách:
push_back
v.v.
Có lẽ quan trọng hơn, list.List
nó không được đánh mạnh - nó rất giống với danh sách và từ điển của Python, cho phép trộn nhiều loại với nhau trong bộ sưu tập. Điều này dường như trái ngược với cách tiếp cận mọi thứ của cờ vây. Go là một ngôn ngữ được đánh máy rất mạnh - ví dụ: chuyển đổi kiểu ngầm không bao giờ được phép trong Go, ngay cả upCast từ int
đến int64
cũng phải rõ ràng. Nhưng tất cả các phương thức cho list.List đều có giao diện trống - mọi thứ đều ổn.
Một trong những lý do mà tôi từ bỏ Python và chuyển sang Go là vì loại điểm yếu này trong hệ thống kiểu của Python, mặc dù Python tuyên bố là "được gõ mạnh" (IMO thì không). Go list.List
dường như là một loại "lai tạp", sinh ra từ C ++ vector<T>
và Python
List()
, và có lẽ hơi lạc lõng trong chính Go.
Tôi sẽ không ngạc nhiên nếu tại một thời điểm nào đó trong tương lai không xa, chúng tôi tìm thấy danh sách.List không được dùng trong Go, mặc dù có lẽ nó sẽ vẫn còn, để phù hợp với những tình huống hiếm hoi , trong đó, ngay cả khi sử dụng các phương pháp thiết kế tốt, một vấn đề có thể được giải quyết tốt nhất với một bộ sưu tập chứa nhiều loại khác nhau. Hoặc có lẽ nó ở đó để cung cấp một "cầu nối" cho các nhà phát triển họ C để họ cảm thấy thoải mái với cờ vây trước khi họ tìm hiểu các sắc thái của các lát cắt, đặc trưng của cờ vây, AFAIK. (Ở một số khía cạnh, các lát cắt có vẻ tương tự như các lớp luồng trong C ++ hoặc Delphi, nhưng không hoàn toàn.)
Mặc dù đến từ nền tảng Delphi / C ++ / Python, nhưng trong lần đầu tiếp xúc với Go, tôi thấy list.List
quen thuộc hơn các lát của Go, vì tôi đã trở nên thoải mái hơn với Go, tôi đã quay lại và thay đổi tất cả danh sách của mình thành các lát. Tôi chưa tìm thấy bất cứ thứ gì slice
và / hoặc map
không cho phép tôi làm, như vậy mà tôi cần sử dụng list.List
.
list
kiểu của Python không được triển khai bằng danh sách liên kết: nó hoạt động tương tự như lát Go, đôi khi yêu cầu các bản sao dữ liệu để mở rộng.