package main
import (
"fmt""sync""unicode/utf8"
)
// 案例:两个goroutine,一个负责输出数字,另一个负责输出26个英文字母,格式如下:12ab34cd56ef78gh ... yzvar (
wg = sync.WaitGroup{}
chNum = make(chanbool)
chAlpha = make(chanbool)
)
funcmain() {
gofunc() {
i := 1for {
<-chNum
fmt.Printf("%v%v", i, i + 1)
i += 2
chAlpha <- true
}
}()
wg.Add(1)
gofunc() {
str := "abcdefghigklmnopqrstuvwxyz"
i := 0for {
<-chAlpha
fmt.Printf("%v", str[i:i+2])
i += 2if i >= utf8.RuneCountInString(str){
wg.Done()
return
}
chNum <- true
}
}()
chNum <- true
wg.Wait()
}
go语言中,channel通道有什么特点,需要注意什么?
案例
package main
import (
"fmt""sync"
)
funcmain() {
var wg sync.WaitGroup
var ch chanintvar ch1 = make(chanint)
fmt.Println(ch, ch1) // <nil> 0xc000086060
wg.Add(1)
gofunc() {
//ch <- 15 // 如果给一个nil的channel发送数据会造成永久阻塞//<-ch // 如果从一个nil的channel中接收数据也会造成永久阻塞
ret := <-ch1
fmt.Println(ret)
ret = <-ch1 // 从一个已关闭的通道中接收数据,如果缓冲区中为空,则返回该类型的零值
fmt.Println(ret)
wg.Done()
}()
gofunc() {
//close(ch1)
ch1 <- 15// 给一个已关闭通道发送数据就会包panic错误close(ch1)
}()
wg.Wait()
}
结论:
给一个nil channel发送数据时会一直堵塞
从一个nil channel接收数据时会一直阻塞
给一个已关闭的channel发送数据时会panic
从一个已关闭的channel中读取数据时,如果channel为空,则返回通道中类型的领零值
go中channel缓冲有什么特点?
无缓冲的通道是同步的,有缓冲的通道是异步的
go中的cap函数可以作用于哪些内容?
可作用于的类型有
数组(array)
切片(slice)
通道(channel)
go convey是什么,一般用来做什么?
go convey是一个支持golang的单元测试框架
能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面
提供了丰富的断言简化测试用例的编写
go语言中new的作用是什么?
使用new函数来分配内存空间
传递给new函数的是一个类型,而不是一个值
返回值是指向这个新分配的地址的指针
go语言中的make作用是什么?
分配内存空间并进行初始化, 返回值是该类型的实例而不是指针
make只能接收三种类型当做参数:slice、map、channel
总结new和make的区别?
new可以接收任意内置类型当做参数,返回的是对应类型的指针
make只能接收slice、map、channel当做参数,返回值是对应类型的实例
Printf、Sprintf、FprintF都是格式化输出,有什么不同?
虽然这三个函数都是格式化输出,但是输出的目标不一样
Printf输出到控制台
Sprintf结果赋值给返回值
FprintF输出到指定的io.Writer接口中
例如:
funcmain() {
var a int = 15
file, _ := os.OpenFile("test.log", os.O_CREATE|os.O_APPEND, 0644)
// 格式化字符串并输出到文件
n, _ := fmt.Fprintf(file, "%T:%v:%p", a, a, &a)
fmt.Println(n)
}
程序实体声明和定义8
var const type func struct map chan interface
程序流程控制15
for range continue break select switch case default if else fallthrough defer go goto return
写一个定时任务,每秒执行一次
funcmain() {
t1 := time.NewTicker(time.Second * 1)
var i = 1for {
if i == 10{
break
}
select {
case <-t1.C: // 一秒执行一次的定时任务
task1(i)
i++
}
}
}
functask1(i int) {
fmt.Println("task1执行了---", i)
}
switch case fallthrough default使用场景
funcmain() {
var a intfor i := 0; i < 10; i++{
a = rand.Intn(100)
switch {
case a >= 80:
fmt.Println("优秀", a)
fallthroughcase a >= 60:
fmt.Println("及格", a)
fallthroughdefault:
fmt.Println("不及格", a)
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)