"github.com/volcengine/ve-tos-golang-sdk/v2/tos"
"github.com/volcengine/ve-tos-golang-sdk/v2/tos/enum"
func (l *listener) DataTransferStatusChange(event *tos.DataTransferStatus) {
case enum.DataTransferStarted:
fmt.Println("Data transfer started")
case enum.DataTransferRW:
if event.TotalBytes != -1 {
fmt.Printf("Once Read:%d,ConsumerBytes/TotalBytes: %d/%d,%d%%\n", event.RWOnceBytes, event.ConsumedBytes, event.TotalBytes, event.ConsumedBytes*100/event.TotalBytes)
fmt.Printf("Once Read:%d,ConsumerBytes:%d\n", event.RWOnceBytes, event.ConsumedBytes)
case enum.DataTransferSucceed:
fmt.Printf("Data Transfer Succeed, ConsumerBytes/TotalBytes: %d/%d,%d%%\n", event.ConsumedBytes, event.TotalBytes, event.ConsumedBytes*100/event.TotalBytes)
case enum.DataTransferFailed:
fmt.Printf("Data Transfer Failed\n")
lastConsumeTime time.Time
func NewDefaultRateLimit(rate int64, capacity int64) tos.RateLimiter {
lastConsumeTime: time.Now(),
currentAmount: capacity,
func (d *rateLimit) Acquire(want int64) (ok bool, timeToWait time.Duration) {
increment := int64(time.Now().Sub(d.lastConsumeTime).Seconds() * float64(d.rate))
if increment+d.currentAmount > d.capacity {
d.currentAmount = d.capacity
d.currentAmount += increment
if want > d.currentAmount {
timeToWaitSec := float64(want-d.currentAmount) / float64(d.rate)
return false, time.Duration(timeToWaitSec * float64(time.Second))
d.lastConsumeTime = time.Now()
func checkErr(err error) {
if serverErr, ok := err.(*tos.TosServerError); ok {
fmt.Println("Error:", serverErr.Error())
fmt.Println("Request ID:", serverErr.RequestID)
fmt.Println("Response Status Code:", serverErr.StatusCode)
fmt.Println("Response Header:", serverErr.Header)
fmt.Println("Response Err Code:", serverErr.Code)
fmt.Println("Response Err Msg:", serverErr.Message)
} else if clientErr, ok := err.(*tos.TosClientError); ok {
fmt.Println("Error:", clientErr.Error())
fmt.Println("Client Cause Err:", clientErr.Cause.Error())
fmt.Println("Error:", err)
accessKey = os.Getenv("TOS_ACCESS_KEY")
secretKey = os.Getenv("TOS_SECRET_KEY")
endpoint = "https://tos-cn-beijing.volces.com"
bucketName = "*** Provide your bucket name ***"
objectKey = "example_dir/example.txt"
ctx = context.Background()
client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))
rateLimit1m := int64(1024 * 1024)
getOutput, err := client.GetObjectV2(ctx, &tos.GetObjectV2Input{
DataTransferListener: &listener{},
RateLimiter: NewDefaultRateLimit(rateLimit1m, rateLimit1m),
ResponseContentType: "application/json",
ResponseContentEncoding: "deflate",
fmt.Println("GetObjectV2 Request ID:", getOutput.RequestID)
fmt.Println("GetObjectV2 Response ContentType:", getOutput.ContentType)
fmt.Println("GetObjectV2 Response ContentEncoding:", getOutput.ContentEncoding)
fmt.Println("GetObjectV2 Response ContentLength", getOutput.ContentLength)
defer getOutput.Content.Close()
body, err := ioutil.ReadAll(getOutput.Content)
fmt.Println("Get Object Content:", body)