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