func (c *IO) ReadWithParams(ctx context.Context, v *IOReadParams) (bool, string, bool, error) {
	resp, err := c.target.SendCustomReturn(ctx, &gcdmessage.ParamRequest{Id: c.target.GetId(), Method: "IO.read", Params: v})
	if err != nil {
		return false, "", false, err
	}
	var chromeData struct {
		Result struct {
			Base64Encoded bool
			Data          string
			Eof           bool
		}
	}
	if resp == nil {
		return false, "", false, &gcdmessage.ChromeEmptyResponseErr{}
	}
	cerr := &gcdmessage.ChromeErrorResponse{}
	json.Unmarshal(resp.Data, cerr)
	if cerr != nil && cerr.Error != nil {
		return false, "", false, &gcdmessage.ChromeRequestErr{Resp: cerr}
	}
	if err := json.Unmarshal(resp.Data, &chromeData); err != nil {
		return false, "", false, err
	}
	return chromeData.Result.Base64Encoded, chromeData.Result.Data, chromeData.Result.Eof, nil
}
ReadWithParams - Read a chunk of the stream
Returns -  base64Encoded - Set if the data is base64-encoded data - Data that were read. eof - Set if the end-of-file condition occurred while reading.
package gcdapi
import (
	"context"
	"github.com/wirepair/gcd/v2/gcdmessage"
)
type IO struct {
	target gcdmessage.ChromeTargeter
}
func NewIO(target gcdmessage.ChromeTargeter) *IO {
	c := &IO{target: target}
	return c
}
type IOCloseParams struct {
	Handle string `json:"handle"`
}
func (c *IO) CloseWithParams(ctx context.Context, v *IOCloseParams) (*gcdmessage.ChromeResponse, error) {
	return c.target.SendDefaultRequest(ctx, &gcdmessage.ParamRequest{Id: c.target.GetId(), Method: "IO.close", Params: v})
}
func (c *IO) Close(ctx context.Context, handle string) (*gcdmessage.ChromeResponse, error) {
	var v IOCloseParams
	v.Handle = handle
	return c.CloseWithParams(ctx, &v)
}
type IOReadParams struct {
	Handle string `json:"handle"`
	Offset int `json:"offset,omitempty"`
	Size int `json:"size,omitempty"`
}