- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在制作一个需要获取分页结果的 JSON API 包装器客户端,其中下一页的 URL 由上一页提供。为了减少共享相同响应格式的 100 多个实体的代码重复,我希望有一个客户端方法可以从所有分页页面中获取和解码不同的实体。
我目前在简化(伪)版本中的方法(没有错误等):
type ListResponse struct {
Data struct {
Results []interface{} `json:"results"`
Next string `json:"__next"`
} `json:"d"`
}
func (c *Client) ListRequest(uri string) listResponse ListResponse {
// Do a http request to uri and get the body
body := []byte(`{ "d": { "__next": "URL", "results": []}}`)
json.NewDecoder(body).Decode(&listResponse)
}
func (c *Client) ListRequestAll(uri string, v interface{}) {
a := []interface{}
f := c.ListRequest(uri)
a = append(a, f.Data.Results...)
var next = f.Data.Next
for next != "" {
r := c.ListRequest(next)
a = append(a, r.Data.Results...)
next = r.Data.Next
}
b, _ := json.Marshal(a)
json.Unmarshal(b, v)
}
// Then in a method requesting all results for a single entity
var entities []Entity1
client.ListRequestAll("https://foo.bar/entities1.json", &entities)
// and somewehere else
var entities []Entity2
client.ListRequestAll("https://foo.bar/entities2.json", &entities)
然而,问题是这种方法效率低下并且使用过多内存等,即首先在一般 ListResponse
中解码,结果为 []interface{}
(到查看下一个 URL 并将结果连接到单个 slice 中),然后编码 []interface{}
以便在 []Entity1
的目标 slice 中直接向后解码它。
我也许可以使用 phản ánh
包来动态生成这些实体的新 slice ,直接解码到它们中,然后连接/附加它们,但是如果我理解正确,我最好不要使用 反射(reflect)
除非绝对必要...
câu trả lời hay nhất
查看 encoding/json
包中的 RawMessage
类型。它允许您将 json 值的解码推迟到以后。例如:
Results []json.RawMessage `json:"results"`
甚至...
Results json.RawMessage `json:"results"`
由于 json.RawMessage
只是一个 byte slice 段,因此这将比您解码到的中间 []interface{}
更有效。
至于第二部分,关于如何在给定多个页面读取的情况下将这些组合成单个 slice ,您可以通过让调用者使用 slice 类型的 slice 来向调用者提出这个问题。
// Then in a method requesting all results for a single entity
var entityPages [][]Entity1
client.ListRequestAll("https://foo.bar/entities1.json", &entityPages)
但是,这仍然存在您的一般设计所存在的无限内存消耗问题,因为您必须一次加载所有页面/项目。您可能需要考虑更改为打开/读取抽象,例如处理文件。你会有一些返回另一种类型的 Mở
方法,像 os.File
一样,它提供了一种一次读取数据子集的方法,同时在内部请求页面和根据需要缓冲。
也许是这样的(未经测试):
type PagedReader struct {
c *Client
buffer []json.RawMessage
next string
}
func (r *PagedReader) getPage() {
f := r.c.ListRequest(r.next)
r.next = f.Data.Next
r.buffer = append(r.buffer, f.Data.Results...)
}
func (r *PagedReader) ReadItems(output []interface{}) int {
for len(output) > len(buffer) && r.next != "" {
r.getPage()
}
n := 0
for i:=0;i
json.Unmarshal(r.buffer[i], output[i] )
n++
}
r.buffer = r.buffer[n:]
return n
}
关于json - 在不使用反射或复制代码的情况下从多个 JSON 数组解码实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52027531/
1. Phản ánh 1. Định nghĩa Cơ chế phản ánh của Java là ở trạng thái đang chạy, đối với bất kỳ lớp nào, tất cả các thuộc tính và phương thức của lớp này (ngay cả khi chúng là riêng tư) đều có thể được biết đối với bất kỳ đối tượng nào, nó có thể được gọi là bất kỳ phương thức và thuộc tính nào; , vậy thì tôi
Có cách nào để lấy tất cả các phương thức (riêng tư, đặc quyền hoặc công khai) từ bên trong đối tượng JavaScript không? Đây là đối tượng ví dụ: var Test = function() { // Private m
Tôi có một lớp trừu tượng "A" và các lớp "B" và "C" mở rộng A. Tôi muốn tạo các phiên bản này trong thời gian chạy dựa trên một số biến. Như được hiển thị bên dưới: public abstract class A { public abstract int
Giả sử chúng ta có nhiều đối tượng trong bộ nhớ. Mỗi người có một ID khác nhau. Làm cách nào tôi có thể lặp qua bộ nhớ để tìm một đối tượng cụ thể để so sánh với một số id? Để lấy nó qua getattr và sử dụng nó? Câu trả lời hay nhất Bạn nên duy trì một bộ sưu tập các đối tượng này vì chúng nằm trong thuộc tính lớp
Giả sử tôi có cấu trúc này và một phương thức: package main import ( "fmt" "reflect" ) type MyStruct struct { } func (a *MyS
Giới thiệu về C# Reflection Reflection (Reflection) là một cơ chế rất hữu ích trong ngôn ngữ C#. Nó có thể lấy thông tin kiểu của một đối tượng một cách linh hoạt trong thời gian chạy và thực hiện các thao tác tương ứng. Reflection là một phương thức được sử dụng rộng rãi trong .NET Framework
Tổng quan Cơ chế phản chiếu đề cập đến khả năng lấy thông tin lớp một cách linh hoạt và vận hành các thành viên lớp (trường, phương thức, hàm tạo, v.v.) trong thời gian chạy. Thông qua phản ánh, chúng ta có thể sử dụng động lực thời gian chạy mà không cần biết loại cụ thể tại thời điểm biên dịch.
Trước tiên chúng ta hãy xem xét một số phép thuật public class Test { Private static void ChangeStrValue(String str, char[] value) {
Cấu trúc struct struct được sử dụng để tùy chỉnh các cấu trúc dữ liệu phức tạp, có thể chứa nhiều trường (thuộc tính) và có thể được lồng vào nhau; kiểu cấu trúc trong go được hiểu là một lớp và các phương thức có thể được định nghĩa, hơi khác so với định nghĩa hàm; kiểu cấu trúc là kiểu giá trị
Phản ánh 1. Định nghĩa về phản chiếu Cơ chế phản chiếu của Java là ở trạng thái đang chạy, đối với bất kỳ lớp nào, tất cả các thuộc tính và phương thức của lớp này đều có thể được biết đối với bất kỳ đối tượng nào, bất kỳ phương thức và thuộc tính nào của nó đều có thể được gọi; , chúng tôi
Định nghĩa về cơ chế phản chiếu (phản ánh) của Java là ở trạng thái đang chạy, đối với bất kỳ lớp nào, tất cả các thuộc tính và phương thức của lớp này đều có thể được gọi; đối với bất kỳ đối tượng nào, bất kỳ phương thức và thuộc tính nào của nó đều có thể được gọi. Thôi nào, sau đó chúng ta có thể
Tôi có một Java POJO: public class Event { id chuỗi riêng; tên chuỗi riêng tư Lon;
Tôi đã viết hàm sau để kiểm tra xem một lớp đơn nhất định có thực hiện một đặc điểm hay không. /** Cho một lớp singleton, trả về đối tượng singleton nếu cls triển khai T.
Tôi đang nghiên cứu những điều cơ bản về phản ánh Java và quan sát về các phương thức lớp. Tôi cần có một phương thức phù hợp với đặc điểm kỹ thuật được mô tả bởi hàm getMethod(). Tuy nhiên khi tôi làm điều này tôi nhận được NoSuchMethodExceptio
Tôi đang truy xuất danh sách các thuộc tính IEnumerable với mã sau: BindingFlags bindFlag = BindingFlags.Instance BindingFlags.Public |
Tôi cần kiểm tra xem một thuộc tính có thuộc tính cụ thể được xác định trong lớp đối tác của nó hay không: [MetadataType(typeof(Metadata))] public seal một phần lớp Địa chỉ { p
Tôi đang cố gắng sử dụng Reflections (do org.reflections cung cấp) để thực hiện một số công việc nặng nhọc nên tôi không cần phải tạo danh sách các phiên bản cho mỗi lớp theo cách thủ công trong một khoảng thời gian dài. Tuy nhiên, Reflections đã không theo kịp tôi.
API phản chiếu scala (2.10) có cung cấp cách dễ dàng hơn để tìm kiếm các lớp đã tải và lọc danh sách theo các lớp cụ thể triển khai các đặc điểm đã xác định không? IE; đặc điểm Widget { def Turn(): Int } lớp
Tôi muốn sử dụng sự phản chiếu trong thời gian chạy để tìm tất cả các lớp có chú thích nhất định, nhưng tôi không biết cách thực hiện việc này trong Scala. Sau đó, tôi muốn lấy giá trị của chú thích và tự động khởi tạo một thể hiện của từng lớp được chú thích ánh xạ tới giá trị chú thích được liên kết. Đây là điều tôi muốn làm: gói pr
Điều này đang diễn ra trong đầu tôi, ai đó có thể giải thích cho tôi rõ hơn không? http://mathworld.wolfram.com/Reflection.html Tôi đang tạo một trò chơi chiến đấu đột phá 2d nên tôi cần quả bóng có thể đập vào tường khi nó chạm vào nó
Tôi là một lập trình viên xuất sắc, rất giỏi!