- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func
并根据 storageA.Type
确定我需要的转换函数打电话。
这些转换函数中的每一个都将返回不同的结构,它们都反射(reflect)了存储 B 中的不同类型。这些存储 B 结构中的每一个都实现了一个公共(public)接口(interface),因此它们可以调用函数。
归根结底,我的问题是我无法将 func(StorageAType) StorageBType1
Chuyển đổi thành func(StorageAType) StorageBType
,mặc dù StorageBtype1
实现了接口(interface) StorageBType
。
我创建了这个相当长的 sân chơi因为我意识到用文字描述问题很棘手。注释掉第 38-41 行和 60-63 行将使其运行,但这是我想使用的那些行。对不起,它的大小,但我想不出一个不那么冗长但清晰的例子。
请注意,我必须重新创建我的 stackoverflow 帐户,所以我认为我没有代表可以对答案发表评论。
*编辑:
非常典型。问完才知道怎么解决。通过在转换器函数中返回接口(interface)类型而不是确切类型,在此 sân chơi 中进行了更改.
câu trả lời hay nhất
具有不同结果类型的函数类型是不同的类型,其中一个结果类型是否实现了另一个并不重要。 Spec: Function types:
A function type denotes the set of all functions with the same parameter and result types.
StorageBtype1
Và StorageBType
是不同的类型,因此以它们作为结果类型的函数类型也不同,并且不能使用其中一种函数类型的值作为另一个的值(value)。
只需将所有转换器函数的结果类型更改为StorageBType
:
func TypeA3ToTypeB1(i StorageAType) StorageBType {
return StorageBType1{i.Type}
}
func TypeA5ToTypeB2(i StorageAType) StorageBType {
return StorageBType2{i.Type, i.Name}
}
由于所有返回值都实现了 StorageBType
,因此这是一个有效的更改,不需要对转换器函数的实现进行任何更改。
现在调用这些函数当然会返回一个StorageBType
类型的值。如果这对您来说已经足够/足够了,那么您就没有什么可做的了。
如果您有任何机会需要返回值作为存储在接口(interface)值中的具体类型,您可以使用 type assertion .
Ví dụ:
a := StorageAType{Type:3}
b := TypeA3ToTypeB1(a) // b is of type StorageBType
if b1, ok := b.(StorageBType1); ok {
// b1 is of type StorageBType1, you may use it like so:
fmt.Println("b1.Type:", b1.Type)
} khác {
// b is not of type StorageBType1, or it is nil
}
Đầu ra:
b1.Type: 3
如果你想测试许多具体类型,你可以使用 type switch :
switch i := b.(type) {
case nil:
fmt.Println("nil")
case StorageBType1:
// Here i is of type StorageBType1, you may refer to its fields:
fmt.Println("StorageBType1", i.Type)
case StorageBType2:
// Here i is of type StorageBType2, you may refer to its fields:
fmt.Println("StorageBType2", i.Type, i.Name)
mặc định:
fmt.Println("Unhandled type!")
}
关于go - 接口(interface)类型的函数返回(另一个)接口(interface)类型的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36788465/
Tôi đang cố gắng sử dụng giao diện nhiều hơn trong cơ sở mã của mình cho máy chủ trò chơi mà tôi đang viết và tìm hiểu về các khái niệm cấp cao cũng như khi nào tôi nên sử dụng giao diện (tôi nghĩ vậy). Trong trường hợp của tôi, tôi sử dụng chúng để tách các gói của mình ra khỏi nhau và tạo
Tôi có một giao diện tên là Widget mà tôi sử dụng trong suốt dự án của mình. Tuy nhiên, nó cũng được sử dụng làm Prop cho một thành phần có tên Widget. Cách tốt nhất để xử lý vấn đề này là gì? Tôi nên thay đổi Widget của mình
Một giao diện có thể là một trong nhiều giao diện giao diện a giao diện {x:string} b giao diện {y:string} c {z:st
Tôi gặp tình huống cần gọi dịch vụ của bên thứ ba để nhận một số thông tin. Những dịch vụ này có thể khác nhau tùy theo từng khách hàng. Tôi có chức năng xác thực trong giao diện của mình như hình bên dưới. giao diện IServiceProvider {bool
Trong ví dụ của tôi, "RequestHandlerProxy" là một cấu trúc có các trường là giao diện "IAdapter" và giao diện có các phương thức có thể được gọi có đầu vào là cấu trúc "Reque"
Tôi có một giao diện Interface1 đã được lớp A triển khai và một số giá trị biến riêng tư được đặt và tôi gửi đối tượng của lớp A đến lớp tiếp theo chấp nhận đầu vào là Giao diện2. Vậy làm thế nào tôi có thể chuyển đổi
Giả sử tôi có cấu trúc lớp và giao diện như thế này: giao diện IService {} giao diện IEmailService : IService { Task SendAs
Có ai biết tôi có thể tìm định nghĩa về giao diện XML-RPC (trong OpenERP 7) ở đâu không? Tôi muốn biết những thông số và thuộc tính đối tượng nào được yêu cầu để tạo hoặc lấy một đối tượng. Các ví dụ XML của từng phần tử cũng sẽ rất hữu ích. câu trả lời hay nhất
Gần đây tôi đã đọc về quan niệm sai lầm rằng giao diện là sự trừu tượng. Một bài đăng như vậy là http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
Nếu tôi có một phần tử IInterface hiện có do bên thứ ba triển khai và tôi muốn thêm các quy trình trợ giúp, Delphi có cung cấp cách dễ dàng nào để đạt được điều này mà không cần chuyển hướng thủ công mọi phương thức giao diện không? Nghĩa là, đưa ra
Tôi đang cố gắng gán một mảng Article cho tài liệu Mongoose của mình nhưng Typescript có vẻ không thích điều đó và tôi không biết tại sao nó lại hiển thị cảnh báo/lỗi này nói rằng nó không thể gán được.
Tôi có hai giao diện: giao diện công khai IController { void doSomething(IEntity thing } public inte);
Có thể tạo giao diện mở rộng giao diện Serializable không? Nếu vậy, giao diện mở rộng có hoạt động giống như giao diện Serilizable (int
Tôi đang cố gắng tạo một lớp trung gian giữa hai cửa hàng lấy dữ liệu từ bộ lưu trữ A, chuyển đổi nó thành loại tương ứng trong bộ lưu trữ B, sau đó lưu trữ dữ liệu đó. Vì tôi cần chuyển đổi khoảng 50-100 loại nên tôi muốn sử dụng map[string]func và thực hiện theo s
Tôi đang thực hiện một yêu cầu trong đó tôi nhận được một đối tượng JSON chứa giá trị ngày dưới dạng chuỗi. Nhiệm vụ của tôi là lưu trữ đối tượng Date trong cơ sở dữ liệu. Đại loại như thế này: {"start_date": "29-05-2019", "
Mục tiêu trong cách tiếp cận của chúng tôi là giới thiệu các giao diện cho các lớp mô hình và DAO hiện có của chúng tôi. Các lớp mô hình được xác định bằng nhiều loại ID tài nguyên khác nhau, không chỉ là số ngẫu nhiên mà còn có ngữ nghĩa và hành vi. Vì vậy, chúng ta phải sử dụng các đối tượng thay vì các kiểu nguyên thủy để biểu diễn
Giao diện Bộ sưu tập có nhiều phương thức. Giao diện Danh sách mở rộng giao diện Bộ sưu tập. Nó khai báo giao diện Collection(int
Tôi có một ứng dụng máy chủ Java sử dụng Jackson để thực hiện tuần tự hóa chung các DTO bằng API phản chiếu. Ví dụ: đối với giao diện DTO này: gói com.acme.libr
Nếu tôi có giao diện trong Kotlin: giao diện KotlinInterface { val id: String } thì tôi có thể triển khai giao diện đó như thế này: class MyCla
Tôi biết sự khác biệt giữa tất cả các công cụ sửa đổi quyền truy cập trong Java. Tuy nhiên, có người đã hỏi tôi một câu hỏi rất thú vị và tôi rất khó tìm ra câu trả lời: Sự khác biệt giữa giao diện riêng và giao diện chung trong Java là gì?
Tôi là một lập trình viên xuất sắc, rất giỏi!