channel
有了通道之后,线程的数据会和main方法一起结束
package main
import "fmt"
func main() {
//创建一个通道
ch := make(chan int)
//开启异步
go func() {
fmt.Println("操作之前")
fmt.Println("操作之后")
//像通道插入数据
ch <- 100
}()
//获取通道的数据
a := <-ch
fmt.Println(a)
fmt.Println("程序结束")
}
2个线程之间保证数据同步
package main
import "fmt"
func main() {
//创建通道
ch := make(chan int)
//用于2个线程之间的同步操作
tongbu := make(chan int)
go func() {
ch <- 111
fmt.Println("插入成功")
tongbu <- 222
}()
go func() {
aa := <-ch
fmt.Println("获取数据", aa)
tongbu <- 333
}()
//获取2次数据 保证2个线程之间执行完毕
<-tongbu
<-tongbu
fmt.Println("程序结束")
}
创建有缓存数量的通道
当我们创建1个通道,但是插入2条数据,没有获取,那么会直接报错 死锁
package main
import "fmt"
func main() {
//创建有缓存的通道
ch := make(chan int, 1)
//插入通道数据
ch <- 111
ch <- 222
fmt.Println("程序结束")
}
当我们改成2个缓存数量的时候,就不会出现死锁了
select
随机返回通道的值,如果没有则走default,如果不加default则会出现死锁
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch2 := make(chan int, 2)
//插入数据
ch <- 1
ch2 <- 2
select {
case a := <-ch:
fmt.Println("aa:", a)
case b := <-ch2:
fmt.Println("bb:", b)
default:
fmt.Println("默认")
}
}
socket
创建server.go,并启动
package main
import (
"fmt"
"net"
)
func main() {
//创建服务器地址
addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8888")
//创建监听器
lis, _ := net.ListenTCP("tcp4", addr)
fmt.Println("服务器启动成功")
//监听客户端传过来的数据
conn, _ := lis.Accept()
//转换数据
b := make([]byte, 1024)
n, _ := conn.Read(b)
fmt.Println(string(b[:n]))
//关闭连接
conn.Close()
}
创建client.go并启动
package main
import (
"fmt"
"net"
)
func main() {
fmt.Println("客户端启动")
//创建服务器地址
addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8888")
//创建连接
conn, _ := net.DialTCP("tcp", nil, addr)
//发送数据
conn.Write([]byte("你好啊,服务器"))
//关闭连接
conn.Close()
}