golang 通过golang发送chunked请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 通过golang发送chunked请求相关的知识,希望对你有一定的参考价值。
package main
import (
"fmt"
"io"
"io/ioutil"
"net/url"
"github.com/benburkert/http"
//"net/http"
//"encoding/binary"
"os"
)
const (
chunk1 = "First Chunk"
chunk2 = "Second Chunk"
)
func main() {
rd, wr := io.Pipe()
//u, _ := url.Parse("http://httpbin.org/post?show_env=1")
//u, _ := url.Parse("http://requestb.in/zox5gczo")
u, _ := url.Parse("https://httpbin.org/post")
req := &http.Request{
Method: "POST",
ProtoMajor: 1,
ProtoMinor: 1,
URL: u,
TransferEncoding: []string{"chunked"},
Body: rd,
Header: make(map[string][]string),
}
req.Header.Set("Content-Type", "audio/pcm;bit=16;rate=8000")
client := http.DefaultClient
go func() {
buf := make([]byte, 300)
f, _ := os.Open("./tq.pcm")
for {
n, _ := f.Read(buf)
if 0 == n {
break
}
wr.Write(buf)
}
wr.Close()
}()
resp, err := client.Do(req)
if nil != err {
fmt.Println("error =>", err.Error())
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if nil != err {
fmt.Println("error =>", err.Error())
} else {
fmt.Println(string(body))
}
}
golang - channel
参考技术A
通过var声明或者make函数创建的channel变量是一个存储在函数栈帧上的指针,占用8个字节,指向堆上的hchan结构体
源码包中src/runtime/chan.go定义了hchan的数据结构如下:
hchan结构体的主要组成部分有四个:
用来保存goroutine之间传递数据的循环数组:buf
用来记录此循环数组当前发送或接收数据的下标值:sendx和recvx
用于保存向该chan发送和从该chan接收数据被阻塞的goroutine队列: sendq 和 recvq
保证channel写入和读取数据时线程安全的锁:lock
环形数组作为channel 的缓冲区 数组的长度就是定义channnel 时channel 的缓冲大小
在hchan 中包括了读/写 等待队列, waitq是一个双向队列,包括了一个头结点和尾节点。 每个节点是一个sudog结构体变量
channel有2种类型:无缓冲、有缓冲, 在创建时 make(chan type cap) 通过cap 设定缓冲大小
channel有3种模式:写操作模式(单向通道)、读操作模式(单向通道)、读写操作模式(双向通道)
channel有3种状态:未初始化、正常、关闭
如下几种状态会引发panic
channel 是线程安全的,channel的底层实现中,hchan结构体中采用Mutex锁来保证数据读写安全。在对循环数组buf中的数据进行入队和出队操作时,必须先获取互斥锁,才能操作channel数据
以上是关于golang 通过golang发送chunked请求的主要内容,如果未能解决你的问题,请参考以下文章
golang 使用Go(Golang)通过GMail发送电子邮件与net / smtp
如果通过 Golang 通道发送,结构是不是实际上在 goroutine 之间复制?
使用 fetch 从通过 golang 提供的 HTML 文件发送请求
在 Golang 中附加文件并通过 SMTP 发送时没有正文部分的电子邮件
在 golang 中使用 gmail API 发送带附件的电子邮件
golang - channel