2022/02/14   今天又是不熬夜的一天,舒服~
package mainimport ("fmt""time"
)func main() {//管道可以声明为只读或者只写//1.在默认情况下,管道是双向的//var chan1 chan int   //可读可写//2.声明为只写var chan2 chan<- intchan2 = make(chan int, 3)chan2 <- 20//3.声明为只读var chan3 <-chan intchan3 = make(<-chan int, 2)num2 := <-chan3fmt.Println("num2", num2)/*可以通过函数传参把双向管道传入实参,函数可以用可读或可写管道接收,防止误操作*///*********使用select可以解决从管道取数据的阻塞问题intChan := make(chan int, 10)for i := 0; i < 10; i++ {intChan <- i}stringChan := make(chan string, 5)for i := 0; i < 5; i++ {stringChan <- "hello" + fmt.Sprintf("%d", i)}/*传统的方法在遍历管道时,如果不关闭会阻塞导致 deadlock在实际开发中,可能不好确定声明时候关闭管道可以使用select方式解决*/
label:for {select {//如果这里intChan一直没有关闭,不会一直阻塞而deadlockcase v := <-intChan:fmt.Println("从intChan读取了数据\n", v)time.Sleep(time.Second)case v := <-stringChan:fmt.Println("从stringChan读取了数据\n", v)time.Sleep(time.Second)default:fmt.Println("都读取不到了,溜了")time.Sleep(time.Second)break label}}
}
package mainimport ("fmt""time"
)func sayHello() {for i := 0; i < 10; i++ {time.Sleep(time.Second)fmt.Println("hello world")}
}func test() {/*panic: assignment to entry in nil map这里会报panic,原因是没有给map make空间主线程中启动两个协程,这个协程panic导致整个程序崩溃,如果希望test()协程不影响到其他协程的运行,可以用 defer + recover*/defer func() {if err := recover(); err != nil {fmt.Println("test()发生错误", err)//这里可以用发邮件或者其他提示开发人员有错误出现//不会影响到其他协程,只会终止本协程}}()var myMap map[int]stringmyMap[0] = "hello"
}func main() {go sayHello()go test()for i := 0; i < 10; i++ {fmt.Println("主线程")time.Sleep(time.Second)}
}
package mainimport ("fmt""reflect"
)/*反射要注意的细节1.reflect.Value.Kind 获取变量的类别,返回的是一个常量(看手册)*//*编写一个案例,演示对基本数据类型,interface{}, reflect.Value进行反射的基本操作
*///专门演示反射
func reflectTest01(b interface{}) {//通过反射获取传入的变量的type-类型,  kind-类别, 值//1.先获取到reflect.TyperType := reflect.TypeOf(b)fmt.Println("rType = ", rType) //rType =  int//2.获取到reflect.ValuerValue := reflect.ValueOf(b)fmt.Println("rValue = ", rValue) //rValue =  100/*这里需要注意这个100不是num的100,而是反射的value值*///获取变量的kind  //两种方法取出来的是一样的fmt.Println("rType kind = ", rType.Kind())   //rType kind =  intfmt.Println("rValue kind = ", rValue.Kind()) //rValue kind =  intn1 := 10n2 := 2 + n1fmt.Println("n2 = ", n2)//n3 := 2 + rValue //cannot convert 2 (untyped int constant) to struct{reflect.flag}/*  */fmt.Printf("rValue = %v, rValue type = %T\n", rValue, rValue)/*rValue = 100, rValue type = reflect.Value*//*通过方法可以获取出 rValue 的值*/n4 := 2 + rValue.Int() //放入的是int值,可以直接用方法,其他的类型也有方法fmt.Println("n4 = ", n4)//如果要把 rValue重新转换成interface{},用断言,再转换成intnum5 := rValue.Interface()num6 := num5.(int)fmt.Println("num6 = ", num6)}func main() { //对变量的反射var num int = 100reflectTest01(num)
}

package mainimport ("fmt""reflect"
)type Student struct {Name stringAge  int
}func reflectTest02(stu interface{}) {//1.先获取到reflect.TyperType := reflect.TypeOf(stu)fmt.Println("rType = ", rType) //rType =  main.Student//2.获取到reflect.ValuerValue := reflect.ValueOf(stu)fmt.Println("rValue = ", rValue) //rValue =  {levi 18}//3.将rValue抓成 interface{}iV := rValue.Interface()fmt.Printf("iV = %v, iV Type = %T\n", iV, iV) //iV = {levi 18}, iV Type = main.Student//4.我们要把接口断言转成需要的类型才能取出结构体中的数据/*  可以用switch更加灵活switch iV.(type) {case Student:fmt.Println("断言为Student结构体")}*/myStu, ok := iV.(Student)if ok {fmt.Println("stu.Name = ", myStu.Name)}}func main() { //对结构体的反射stu := Student{"levi", 18}reflectTest02(stu)
}
package mainimport "fmt"/*常量介绍1.常量使用const修饰2.常量在定义的时候,必须初始化3.常量不能修改4.常量只能修饰bool,数值类型(int,float系列),string类型5.语法:const identifier [type] = value6.常量也是通过首字母的大小写来控制访问范围
*/func main() {//1.2const tax int = 0//3.error//tax = 10//cannot assign to tax (constant 0 of type int)const name = "levi"const t float64 = 0.8//const a int //errconst q = 9 / 3 //  9/3是常量值,没问题//num := 2//const c = 8 / num //err,编译器认为num是变量,//num是不确定的可变的,但是c又是不可变的//比较简洁的写法const (a = 1b = 2)//还有一种专业的写法,像枚举const (p = iota // p默认为0oiu)fmt.Printf("p = %d, o = %d, i= %d, u = %d\n", p, o, i, u)//p = 0, o = 1, i= 2, u = 3const (p1     = iota // iota默认为0o1     = iotai1, u1 = iota, iota)fmt.Printf("p1 = %d, o1 = %d, i1 = %d, u1 = %d\n", p1, o1, i1, u1)//p1 = 0, o1 = 1, i1 = 2, u1 = 2// iota 默认是0 换行会+1, 在一行里面值不会变
}

GO语言学习之路23相关推荐

  1. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  2. Go语言学习之路(二)

    Go语言学习之路(二) 面对对象编程思想 抽象 封装 继承 接口 文件 命令行参数 Json 序列化 反序列化(unmarshal) 单元测试 Redis Redis简介 Redis基本使用 Go连接 ...

  3. C语言-学习之路-01

    C语言学习之路-01 目录 关键字 数据类型 常量 变量 声明和定义 进制 sizeof关键字 整型:int short.int.long.long long 字符型:char ASCII对照表 转义 ...

  4. C语言学习之路--计算机系统组成以及工作原理,进制之间的转换和机器数及其表示范围

    目录 一.前言 二.计算机系统组成以及工作原理简介 1.硬件系统基本组成原理及工作原理 2.硬件各部分详解 1.运算器 2.控制器 CPU 3.存储器 1.内存储器 2.外存储器 3.拓展 4.存储器 ...

  5. Go语言学习之路——Go语言简介

    本文首发于我的博客 很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东 ...

  6. C语言学习之路--函数,从知识到实战

    目录 一.前言 二.函数是什么? 三.C语言中函数的分类 1.库函数 1.为什么会有库函数? 2.如何学习库函数? 3.学习库函数举例 1.strcpy 2.memset 3.库函数学习工具总结 2. ...

  7. GO语言学习之路20

    2022/02/11 //舒适的环境很难培养出坚强的品格,被安排好的人生也很难做出伟大的事业package mainimport ("encoding/json""fmt ...

  8. C语言学习之路--C语言中的格式输出

    一.前言 在我们初学C语言的过程中,会有一些类似%d之类的格式输出,我在此做个汇总,供大家学习. 二.分类 1.%u 十进制无符号整数. 2.%f 表示输出浮点数. 可以通过输出格式说明符来指定精确到 ...

  9. R语言学习之路——进入R的大门

    数据分析之R语言 基础统计指标 指标 描述 均值(mean) 即平均数,mean=1/n*sum(X1:Xn);均值能够利用所有已知信息,但是对异常值(极小或极大值)很敏锐: 中位数(median) ...

最新文章

  1. 始于TensorFlow ,终于PyTorch
  2. python2.7爬虫实例-用案例让你一文搞懂python网络爬虫
  3. 更新ubuntu软件源
  4. 机器学习:贝叶斯分类器,朴素贝叶斯,拉普拉斯平滑
  5. intellij运行flink的wordcount实验-Java版本
  6. 如何基于MaxCompute快速打通数据仓库和数据湖的湖仓一体实践
  7. 删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点
  8. 解决vue axios跨域请求发送两次问题
  9. python的with用法
  10. 激光雕刻机——广告制作新利器
  11. cad通过钢筋大样生成钢筋明细表插件_为什么自动生成的钢筋明细表为空 - 应用技巧 - 常青藤软件工作室...
  12. [转]AVALONDOCK 2.0入门指南第一部分
  13. oracle课堂收录-触发器
  14. VUE游戏开发:使用Box2D模拟球体的飞行和撞击特效
  15. python 采用数值方法计算最速曲线
  16. Python开发培训怎么样?
  17. 【边学边记_12】——VGA原理与FPGA实现
  18. 【鸿蒙】鸿蒙App应用-《记账软件》登录,注册,找回密码功能
  19. 湿气重会有哪些表现?如何祛湿
  20. 华为盒子EC6110-T_悦me高安版_线刷固件(通刷版)

热门文章

  1. Keepalived实战(3)
  2. 设计模式-------建造者模式(生成器模式)
  3. vim 使用、设置笔记
  4. 原创:协同过滤之ALS
  5. 聊天内容3.2 浏览器
  6. Android开发遇到的异常及解决办法
  7. 按键显示按键编码 keycode
  8. 高通针对LED应用的点阵字库解决方案 — 支持多种字号字体显示
  9. 单列(写了池子pool)用list实现的方法, 与伪单例(写了池子zidianpool),用字典实现的方法,可以存入不同,i名字的物体...
  10. 如何对shell脚本进行加密且不影响脚本运行