Golang从..到读取字节数组并显示结果

时间:2018-07-26 09:06:16

标签: arrays go io

首先:我知道这是一个超级基本的问题,您希望可以在互联网上找到足够的资料,而且可能会有。我现在由于不了解它而感到非常愚蠢,因此无需向我指出-我知道^^ 从google Directory API中,读取自定义架构时收到的响应是JSON编码的: https://developers.google.com/admin-sdk/directory/v1/reference/schemas 我复制/粘贴了该回复并想阅读。

 func main() {
    jsonExample := `
    {
  "kind": "admin#directory#schema",
  "schemaId": "string",
  "etag": "etag",
  "schemaName": "string",
  "displayName": "string",
  "fields": [
    {
      "kind": "admin#directory#schema#fieldspec",
      "fieldId": "string",
      "etag": "etag",
      "fieldType": "string",
      "fieldName": "string",
      "displayName": "string",
      "multiValued": true,
      "readAccessType": "string",
      "indexed": true,
      "numericIndexingSpec": {
        "minValue": 2.0,
        "maxValue": 3.0
      }
    }
  ]
}
`

    var jsonDec schemaExample

    jsonExampleBytes := []byte(jsonExample)    

    m := make(map[string]interface{})
    err := json.Unmarshal([]byte(jsonExample), &m)
    byteStorage := make([]byte,600)
        byteReader := bytes.NewReader(byteStorage)
res, err := byteReader.ReadAt(jsonExampleBytes,50)
fmt.Printf("############Hier : %v Err: \n%v",res,err)
fmt.Printf("Storage: %v\n",byteStorage)



byteStorage := make([]byte,600)
byteReader := bytes.NewReader(byteStorage)
        res, err := byteReader.ReadAt(jsonExampleBytes,50)
        fmt.Printf("Result : %v Err: %v\n",res,err)
        fmt.Printf("Storage: %v\n",byteStorage)

这将返回

res : 526 Err: <nil>
Storage: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

。我的问题是如何实现ReadFromTo方法,该方法允许我从字节数组中读取特定范围的字节?而且由于存储空间是空的,所以我也完全不了解如何使用读取器功能来读取该数组,只有这样,我才知道如何将其拉回:

fmt.Printf("Und die bytes to String: %v",string([]byte(jsonExample)))

2 个答案:

答案 0 :(得分:3)

从文档中(重点是我):

  

ReaderAt是包装基本ReadAt方法的接口。

     

ReadAt将len(p)个字节读取到 p中,从底层输入源的偏移量开始。

type ReaderAt interface {
    ReadAt(p []byte, off int64) (n int, err error)
}

ReadAt(通常是Read)的参数是目的地。您有错误的方法来获取jsonExampleBytes和byteStorage。

package main

import (
        "bytes"
        "fmt"
)

func main() {
        jsonExampleBytes := []byte(`{...}`)

        byteReader := bytes.NewReader(jsonExampleBytes)

        byteStorage := make([]byte, 600)
        n, err := byteReader.ReadAt(byteStorage, 3)

        fmt.Println("Storage:", string(byteStorage[:n]), err) // Storage: .} EOF
}

答案 1 :(得分:1)

要访问字节的子片,在最基本的情况下,您可以使用索引运算符:

array := make([]byte, 100)
bytes5to9 = array[5:10]

请注意,第二个索引是排他性的。

如果您需要这些字节中的io.Reader,则可以使用

r := bytes.NewReader(array[5:10])

您可以再次执行此操作,为数组的相同或不同范围创建第二个读数。

ioioutil中的实用程序功能也可能使您感兴趣。例如,请参见ioutil.ReadAllio.Copyio.CopyBufferio.CopyNio.ReadFull