[日常] Go语言圣经--Channel习题
练习 8.3: 在netcat3例子中,conn虽然是一个interface类型的值,但是其底层真实类型是*net.TCPConn,代表一个TCP连接。一个TCP连接有读和写两个部分,可以使用CloseRead和CloseWrite方法分别关闭它们。修改netcat3的主goroutine代码,只关闭网络连接中写的部分,这样的话后台goroutine可以在标准输入被关闭后继续打印从reverb1服务器传回的数据。(要在reverb2服务器也完成同样的功能是比较困难的;参考练习 8.4。)
1.
net.Dial()
func Dial(network, address string) (Conn, error)
2.net.TCPConn
type TCPConn struct {
// contains filtered or unexported fields
}
TCPConn is an implementation of the Conn interface for TCP network connections.
package mainimport ("io""log""net""os" )func main() {conn, err := net.Dial("tcp", "localhost:8040")if err != nil {log.Fatal(err)} //内置make函数创建一个channel,可以发送struct类型的数据done := make(chan struct{})//go语句调用一个函数字面量,启动goroutine的常用形式go func() {//从网络连接到标准输出,如果连接没断也会阻塞//如果TCP的读连接关闭会报错:use of closed network connection_, err := io.Copy(os.Stdout, conn)log.Println(err)log.Println("done")//发送channel给接收goroutinedone <- struct{}{}}() //从标准输入到网络连接中,这个地方会阻塞,按Control+D关闭标准输入mustCopy(conn, os.Stdin)// conn.Close()//类型断言,调用*net.TCPConn的方法CloseWrite()只关闭TCP的写连接cw := conn.(*net.TCPConn)cw.CloseWrite()<-done // 阻塞等待后台 goroutine 完成接收channel } func mustCopy(dst io.Writer, src io.Reader) {if _, err := io.Copy(dst, src); err != nil {log.Fatal(err)} }
转载于:https://www.cnblogs.com/taoshihan/p/8970647.html
[日常] Go语言圣经--Channel习题相关推荐
- [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题
go语言圣经-声明 1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明 2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明 ...
- [日常] Go语言圣经-基于select的多路复用习题
练习 8.8: 使用select来改造8.3节中的echo服务器,为其增加超时,这样服务器可以在客户端10秒中没有任何喊话时自动断开连接. reverb3.go package mainimport ...
- [日常] Go语言圣经-函数递归习题
练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...
- 《go语言圣经》习题答案-第5章
目录 5.11 5.13 5.14 5.15 5.16 5.17 5.19 习题答案,个人理解,欢迎交流指正 5.11 package mainimport ("fmt"" ...
- 《go语言圣经》习题答案-第9章
目录 9.1 9.2 9.3 9.4 9.5 9.6 因为并发的程序需要保证内存可见性,因此了解go语言的happens-before规则很重要,请参考: 后端 - go语言happens-befor ...
- [日常] Go语言圣经-Deferred函数
1.只需要在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法.当defer语句被执行时,跟在defer后面的函数会被延迟执行.直到包含该defer语句的函数执行完毕时,defe ...
- [日常] Go语言圣经-GIF动画练习语法
1.常量声明的值必须是一个数字值.字符串或者一个固定的boolean值. 2.常量声明和变量声明一般都会出现在包级别 3.[]color.Color{...}生成的是一个slice切片和gif.GIF ...
- 《go语言圣经》习题答案-第8章
目录 8.1 8.3 8.4 8.5 8.6 8.8 8.9 8.10 8.11 8.12 8.13 8.14 8.15 8.1 server代码 // Copyright © 2016 Alan A ...
- 【go语言圣经】习题答案 第三章
第三章练习题答案 3.1 修改无限制的float64值,跳过无效的多边形 3.2 试验math包中其他函数的渲染图形 马鞍面 3.3根据高度给每个多边形上色 3.4 构造web服务器,返回SVG数据给 ...
最新文章
- 以太坊去中心化_开发以太坊去中心化投票应用程序的指南
- 巨大的需求之下 人工智能如何更快落地?
- 【视频】React redux toolkit创建状态切片
- Tomcat相关目录及配置文件总结
- 前端js vue遇到的一些简单的数据处理-持续更新
- linux dump命令 异机,Oracle 11.2.0.4 从单实例,使用RMAN 异机恢复到RAC
- Linux C 串口属性设置
- php的crypt,php使用crypt()函数进行加密
- 前端事件绑定知识点(面试常考)
- linux C(hello world)最大公约数和最小公倍数
- Matlab之subplot函数
- bug篇——MySQL的时区问题
- 检测精度大幅提升!移动端实时的NanoDet升级版NanoDet-Plus来了!
- gentoo Wireless Configuration
- 商品管理系统数据库设计--SQL Server
- HBase2.4.10 踩坑笔记
- amd cpu排行_最新intel和amd处理器性能排行cpu天梯图2019
- sybil attack (女巫攻击)
- [随笔所想] 学英语打卡2000天碎碎念
- Git 同步代码两例常见报错
热门文章
- boost::geometry::num_geometries用法的测试程序
- boost::coroutine2模块实现相同的边缘的测试程序
- VTK:PolyData之ExtractCellsUsingPoints
- OpenCV清除背景扣除background subtraction的实例(附完整代码)
- OpenCV HDF创建,写入和读取数据集
- OpenCV运行自定义OCR模型
- Qt Linguist翻译过程概述
- C++打印STAIRS 图案算法(附完整源码)
- C/C++中extern的用法 ?
- C++vector进行局部排序