Go语言圣经–示例: 并发的Echo服务详解编程语言
2023-06-13 09:20:37 时间
原理:
1.io.Copy()方法
func Copy(dst Writer, src Reader) (written int64, err error)
2.net.Conn类型
type Conn interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
}
一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口
3.io.Writer
type Writer interface {
Write(p []byte) (n int, err error)
}
4.io.Reader
type Reader interface {
Read(p []byte) (n int, err error)
}
升级版,每条连接一个goroutine,每个goroutine中分出多个输出goroutine
package main import ( "bufio" "fmt" "log" "net" "strings" "time" func main() { listener, err := net.Listen("tcp", ":8040") if err != nil { log.Fatal(err) for { conn, err := listener.Accept() if err != nil { log.Print(err) // e.g., connection aborted continue go handleConn(conn) //新建goroutines处理连接 func handleConn(c net.Conn) { input := bufio.NewScanner(c) for input.Scan() { go echo(c, input.Text(), 1*time.Second) // NOTE: ignoring potential errors from input.Err() c.Close() func echo(c net.Conn, shout string, delay time.Duration) { fmt.Fprintln(c, "/t", strings.ToUpper(shout)) time.Sleep(delay) fmt.Fprintln(c, "/t", shout) time.Sleep(delay) fmt.Fprintln(c, "/t", strings.ToLower(shout))
1.fmt.Fprintln()
func Fprintln(w io.Writer, a interface{}) (n int, err error)
2.bufio.NewScanner()
func NewScanner(r io.Reader) *Scanner
func (s *Scanner) Scan() bool
func (s *Scanner) Text() string
也用到了大量的7.3节 实现接口的条件
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12531.html
cgo相关文章
- 01.Go语言-开篇综述
- 2022-09-06:以下go语言代码输出什么?A:Hi All;B:Hi go All;C:Hi;D:go All。 package main import
- 使用Go设计多缓存驱动
- grpc-go之身份验证(二)
- 3.Go编程快速入门学习
- 一期Go群问答-并发控制-数据竞争-错误与异常
- go的并发小知识
- 「Go工具箱」将文件大小转换成Kb、Mb、Gb就用这个库:go-humanize
- 【译文】Go 中的适配器模式
- go的数据类型-其他数据类型-function(二)
- go的数据类型-其他数据类型-interface(二)
- Go-包管理-go build(二)
- Go RWMutex:高并发读多写少场景下的性能优化利器
- Go语言变量的作用域
- Go语言reflect.TypeOf()和reflect.Type(通过反射获取类型信息)
- go test命令(Go语言测试命令)完全攻略
- Go_ go mod 命令解决墙的问题详解编程语言
- 程序Linux上运行Go语言程序的指南(linux运行go)
- Go语言环境配置:在 Linux 下实现(go环境搭建linux)
- MySQL中使用Go语言的好处(mysql中go什么)
- 快跟上趋势,GO DB ORACLE(go db oracle)