练习 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习题相关推荐

  1. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明 1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明 2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明 ...

  2. [日常] Go语言圣经-基于select的多路复用习题

    练习 8.8: 使用select来改造8.3节中的echo服务器,为其增加超时,这样服务器可以在客户端10秒中没有任何喊话时自动断开连接. reverb3.go package mainimport ...

  3. [日常] Go语言圣经-函数递归习题

    练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...

  4. 《go语言圣经》习题答案-第5章

    目录 5.11 5.13 5.14 5.15 5.16 5.17 5.19 习题答案,个人理解,欢迎交流指正 5.11 package mainimport ("fmt"" ...

  5. 《go语言圣经》习题答案-第9章

    目录 9.1 9.2 9.3 9.4 9.5 9.6 因为并发的程序需要保证内存可见性,因此了解go语言的happens-before规则很重要,请参考: 后端 - go语言happens-befor ...

  6. [日常] Go语言圣经-Deferred函数

    1.只需要在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法.当defer语句被执行时,跟在defer后面的函数会被延迟执行.直到包含该defer语句的函数执行完毕时,defe ...

  7. [日常] Go语言圣经-GIF动画练习语法

    1.常量声明的值必须是一个数字值.字符串或者一个固定的boolean值. 2.常量声明和变量声明一般都会出现在包级别 3.[]color.Color{...}生成的是一个slice切片和gif.GIF ...

  8. 《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 ...

  9. 【go语言圣经】习题答案 第三章

    第三章练习题答案 3.1 修改无限制的float64值,跳过无效的多边形 3.2 试验math包中其他函数的渲染图形 马鞍面 3.3根据高度给每个多边形上色 3.4 构造web服务器,返回SVG数据给 ...

最新文章

  1. 以太坊去中心化_开发以太坊去中心化投票应用程序的指南
  2. 巨大的需求之下 人工智能如何更快落地?
  3. 【视频】React redux toolkit创建状态切片
  4. Tomcat相关目录及配置文件总结
  5. 前端js vue遇到的一些简单的数据处理-持续更新
  6. linux dump命令 异机,Oracle 11.2.0.4 从单实例,使用RMAN 异机恢复到RAC
  7. Linux C 串口属性设置
  8. php的crypt,php使用crypt()函数进行加密
  9. 前端事件绑定知识点(面试常考)
  10. linux C(hello world)最大公约数和最小公倍数
  11. Matlab之subplot函数
  12. bug篇——MySQL的时区问题
  13. 检测精度大幅提升!移动端实时的NanoDet升级版NanoDet-Plus来了!
  14. gentoo Wireless Configuration
  15. 商品管理系统数据库设计--SQL Server
  16. HBase2.4.10 踩坑笔记
  17. amd cpu排行_最新intel和amd处理器性能排行cpu天梯图2019
  18. sybil attack (女巫攻击)
  19. [随笔所想] 学英语打卡2000天碎碎念
  20. Git 同步代码两例常见报错

热门文章

  1. boost::geometry::num_geometries用法的测试程序
  2. boost::coroutine2模块实现相同的边缘的测试程序
  3. VTK:PolyData之ExtractCellsUsingPoints
  4. OpenCV清除背景扣除background subtraction的实例(附完整代码)
  5. OpenCV HDF创建,写入和读取数据集
  6. OpenCV运行自定义OCR模型
  7. Qt Linguist翻译过程概述
  8. C++打印STAIRS 图案算法(附完整源码)
  9. C/C++中extern的用法 ?
  10. C++vector进行局部排序