2015-01-09 34 views

答えて

2

あなたがここにio.Reader

をラップすることにより、それを使用the package on github

の更新バージョンがありますがsloooowlyのGoogle veeeeryのホームページが表示されます完全な例です。

これは新しい機能を作成するためのインターフェイスをラップすることは非常に良いGoスタイルであり、あなたはGoへの旅の中で多くを見るでしょう。

package main 

import (
    "io" 
    "log" 
    "net/http" 
    "os" 

    "github.com/mxk/go-flowrate/flowrate" 
) 

func main() { 
    resp, err := http.Get("http://google.com") 
    if err != nil { 
     log.Fatalf("Get failed: %v", err) 
    } 
    defer resp.Body.Close() 

    // Limit to 10 bytes per second 
    wrappedIn := flowrate.NewReader(resp.Body, 10) 

    // Copy to stdout 
    _, err = io.Copy(os.Stdout, wrappedIn) 
    if err != nil { 
     log.Fatalf("Copy failed: %v", err) 
    } 
} 
+0

5MBなどの制限に達した場合のチェックインはどうですか?私はちょうどb:= make([byte]、5000000)を使用しますか? wrappedIn.Read(b);? – John

+1

あなたは[io.LimitedReader](http://golang.org/pkg/io/#LimitedReader)に 'io.Reader'をラップしません。 –

+0

これは、カーネルのTCPバッファから読み取る速度を制限します。リモートから読み取る速度に直接影響するわけではありません。ローカルTCPバッファがいっぱいになると、ネットワークがアイドル状態になり、バッファから(ゆっくりと)読み込み、次にバッファを再充填するためにバーストします。大規模ダウンロードの場合は、リモートから平均10バイト/秒ですが、ダウンロードが少ない場合は、ネットワークアクティビティに差はなく、ゆっくりと消費します。ネットの活動を制限するには、https://unix.stackexchange.com/questions/28198/how-to-limit-network-bandwidthを参照してください。 –

11

サードパーティ製のパッケージには、便利なラッパーを持っています。しかし、フードの中で物事がどのように機能するかに興味があれば、それは非常に簡単です。

package main 

import (
    "io" 
    "net/http" 
    "os" 
    "time" 
) 

var datachunk int64 = 500  //Bytes 
var timelapse time.Duration = 1 //per seconds 

func main() { 
    responce, _ := http.Get("http://google.com") 
    for range time.Tick(timelapse * time.Second) { 
     _, err :=io.CopyN(os.Stdout, responce.Body, datachunk) 
     if err!=nil {break} 
    } 
} 

ナッシングマジック。

関連する問題