91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何從go源代碼讀懂interface接口

發布時間:2021-11-25 22:41:24 來源:億速云 閱讀:151 作者:柒染 欄目:開發技術

本篇文章為大家展示了如何從go源代碼讀懂interface接口,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

go源代碼中的接口

http庫中,get方法:

1
func Get(url string) (resp *Response, err error)

Response:

1
2
3
4
5
6
7
8
9
type Response struct {
       Status     string // e.g. "200 OK"
       StatusCode int    // e.g. 200
       Proto      string // e.g. "HTTP/1.0"
       ProtoMajor int    // e.g. 1
       ProtoMinor int    // e.g. 0
       Header Header

       Body io.ReadCloser

io.ReadCloser:

1
2
3
4
type ReadCloser interface {
       Reader
       Closer
}

Reader:

1
2
3
type Reader interface {
       Read(p []byte) (n int, err error)
}

Closer:

1
2
3
type Closer interface {
       Close() error
}

不管是讀取文件、網絡等操作,都實現了相同的Reader接口。當傳遞[]byte進去,會將讀取到的byte放置進去。成功會返回成功的個數。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"net/http"
"fmt"
"os"
)

func main(){
resp,err := http.Get("http://tmall.com")

if err !=nil{
fmt.Println("Error:",err)
os.Exit(1)
}
 //設置大一點,read方法不會自動的擴容。
bs:=make([]byte,99999)
 //read函數將讀取到的數據放入到bs中。
resp.Body.Read(bs)
fmt.Println(string(bs))
}

write接口

1
2
3
type Writer interface {
       Write(p []byte) (n int, err error)
}

io.opy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

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

func main(){
resp,err := http.Get("http://tmall.com")

if err !=nil{
fmt.Println("Error:",err)
os.Exit(1)
}

//讀取resp.Body中的信息,寫到os.Stdout中。os.Stdout實現了write接口,resp.Body實現了read接口。
io.Copy(os.Stdout,resp.Body)
}

io.copy源碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
func Copy(dst Writer, src Reader) (written int64, err error) {
return copyBuffer(dst, src, nil)
}

---------
func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
if buf != nil && len(buf) == 0 {
panic("empty buffer in io.CopyBuffer")
}
return copyBuffer(dst, src, buf)
}
---------
func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
// If the reader has a WriteTo method, use it to do the copy.
// Avoids an allocation and a copy.
if wt, ok := src.(WriterTo); ok {
return wt.WriteTo(dst)
}
// Similarly, if the writer has a ReadFrom method, use it to do the copy.
if rt, ok := dst.(ReaderFrom); ok {
return rt.ReadFrom(src)
}
size := 32 * 1024  
if l, ok := src.(*LimitedReader); ok && int64(size) > l.N {
if l.N < 1 {
size = 1
} else {
size = int(l.N)
}
}
if buf == nil {
buf = make([]byte, size)//分配
}
for {   //瘋狂讀取并寫入
nr, er := src.Read(buf)
if nr > 0 {
nw, ew := dst.Write(buf[0:nr])
if nw > 0 {
written += int64(nw)
}
if ew != nil {
err = ew
break
}
if nr != nw {
err = ErrShortWrite
break
}
}
if er != nil {
if er != EOF {
err = er
}
break
}
}
return written, err
}

自定義Writer函數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

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


type logWriter struct{}

func main(){
resp,err := http.Get("http://tmall.com")

if err !=nil{
fmt.Println("Error:",err)
os.Exit(1)
}

lw:= logWriter{}

 //讀取resp.Body中的信息,寫到os.Stdout中。os.Stdout實現了write接口,resp.Body實現了read接口。
io.Copy(lw,resp.Body)
}

func (logWriter) Write(bs []byte)(int,error){
fmt.Println(string(bs))
fmt.Println("Just wrote this many bytes",len(bs))
return len(bs),nil
}

上述內容就是如何從go源代碼讀懂interface接口,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌什县| 城市| 西乌珠穆沁旗| 商南县| 东乡| 永靖县| 鄂州市| 泰宁县| 昌黎县| 长武县| 永丰县| 千阳县| 灯塔市| 蕲春县| 金昌市| 蒙山县| 华宁县| 黄大仙区| 呼伦贝尔市| 上蔡县| 华阴市| 平泉县| 西丰县| 手游| 仲巴县| 永靖县| 临武县| 象山县| 方山县| 靖州| 赣州市| 通辽市| 高清| 万盛区| 双鸭山市| 桦甸市| 光山县| 阿鲁科尔沁旗| 突泉县| 西平县| 福泉市|