我献出这篇 go 精华总结,阁下该如何应对(2)

简介: 我献出这篇 go 精华总结,阁下该如何应对(2)

6.常量

不可被修改的变量。

package main
import "fmt"
func main() {
  // 定义变量
  //var name string = "林冲"
  //var name = "林冲"
  name := "林冲"
  name = "lc"
  fmt.Println(name)
  // 定义常量
  //const age int = 98
  const age = 98
  fmt.Println(age)
}

6.1 因式分解

package main
import "fmt"
func main() {
  // 定义变量
  //var name string = "林冲"
  //var name = "林冲"
  name := "林冲"
  name = "lc"
  fmt.Println(name)
  // 定义常量
  //const age int = 98
  const age = 98
  fmt.Println(age)
  // 常量因式分解
  const (
    v1 = 123
    v2 = 456
    pi = 9.9
  )
  fmt.Println(v1, v2, pi, gender)
}

6.2 全局

package main
import "fmt"
const Data = 999
const (
  pi     = 3.1415926
  gender = "男"
)
func main() {
  // 定义变量
  //var name string = "林冲"
  //var name = "林冲"
  name := "林冲"
  name = "lc"
  fmt.Println(name)
  // 定义常量
  //const age int = 98
  const age = 98
  fmt.Println(age)
  // 常量因式分解
  const (
    v1 = 123
    v2 = 456
    //pi = 9.9
  )
  fmt.Println(v1, v2, pi, gender)
}

6.3 iota

可有可无,当做一个在声明常量时的一个计数器。

package main
const (
  monday = iota + 1
  tuesday
  wednesday
  thursday
  friday
  saturday
  sunday
)
const (
  n1 = iota
  n2
  n3
)
func main() {
  // iota
  // 示例1
  /*
    const (
      v1 = 1
      v2 = 2
      v3 = 3
      v4 = 4
      v5 = 5
    )
    fmt.Println(v1, v2, v3, v4, v5)
  */
  // 示例2
  /*
    const (
      v1 = iota
      v2
      v3
      v4
      v5
    )
    fmt.Println(v1, v2, v3, v4, v5)
  */
  // 示例3
  /*
    const (
      v1 = iota + 2
      v2
      v3
      v4
      v5
    )
    fmt.Println(v1, v2, v3, v4, v5)
  */
  // 示例4:
  /*
    const (
      v1 = iota + 2
      _
      v2
      v3
      v4
      v5
    )
    fmt.Println(v1, v2, v3, v4, v5)
  */
}

7.输入

让用户输入数据,完成项目交互。

  • fmt.Scan
  • fmt.Scanln
  • fmt.Scanf
package main
import "fmt"
func main() {
  // 示例1:fmt.Scan
  /*
    var name string
    fmt.Println("请输入用户名:")
    fmt.Scan(&name)
    fmt.Printf(name)
  */
  // 示例2:fmt.Scan
  var name string
  var age int
  fmt.Println("请输入用户名:")
  // 当使用Scan时,会提示用户输入
  // 用户输入完成之后,会得到两个值:count,用户输入了几个值;err,用输入错误则是错误信息
  _, err := fmt.Scan(&name, &age)
  if err == nil {
    fmt.Println(name, age)
  } else {
    fmt.Println("用户输入数据错误", err)
  }
  // 特别说明:fmt.Scan 要求输入两个值,必须输入两个,否则他会一直等待。
}
package main
import "fmt"
func main() {
  // 示例1:fmt.Scanln
  /*
    var name string
    fmt.Print("请输入用户名:")
    fmt.Scanln(&name)
    fmt.Printf(name)
  */
  // 示例2:fmt.Scanln
  var name string
  var age int
  fmt.Print("请输入用户名:")
  // 当使用Scanln时,会提示用户输入
  // 用户输入完成之后,会得到两个值:count,用户输入了几个值;err,用输入错误则是错误信息
  count, err := fmt.Scanln(&name, &age)
  fmt.Println(count, err)
  fmt.Println(name, age)
  // 特别说明:fmt.Scanln 等待回车。
}
package main
import "fmt"
func main() {
  var name string
  var age int
  fmt.Print("请输入用户名:")
  _, _ = fmt.Scanf("我叫%s 今年%d 岁", &name, &age)
  fmt.Println(name, age)
}

无法解决的难题?

微信截图_20231016221906.png

package main
import (
  "bufio"
  "fmt"
  "os"
)
func main() {
  reader := bufio.NewReader(os.Stdin)
  // line,从stdin中读取一行的数据(字节集合 -> 转化成为字符串)
  // reader默认一次能4096个字节(4096/3)
  //    1. 一次性读完,isPrefix=false
  //    2. 先读一部分,isPrefix=true,再去读取isPrefix=false
  line, _, _ := reader.ReadLine()
  data := string(line)
  fmt.Println(data)
}

8.条件语句

8.1 最基本

if 条件 {
    成立后,此代码块执行
}else{
    不成立,此代码块执行
}
if 条件 {
    成立后,此代码块执行
}

示例:

package main
func main() {
  /*
    if true {
      fmt.Println("666")
    }else{
      fmt.Println("999")
    }
  */
  /*
    if 1 > 2 {
      fmt.Println("666")
    } else {
      fmt.Println("999")
    }
  */
  /*
    flag := false
    if flag {
      fmt.Println("条件成立")
    }else{
      fmt.Println("条件不成立")
    }
  */
  // 练习题1:用户输入姓名,判断是否正确
  /*
    var name string
    fmt.Print("请输入姓名:")
    fmt.Scanln(&name)
    if name == "alex" {
      fmt.Println("用户名输入正确")
    } else {
      fmt.Println("用户名输入错误")
    }
  */
  // 练习题2:用户输入数字,判断奇数、偶数
  /*
    var number int
    fmt.Print("请输入数字:")
    fmt.Scanln(&number)
    if number % 2 == 0{
      fmt.Println("您输入的是偶数")
    }else{
      fmt.Println("您输入的是奇数")
    }
  */
  // 练习题3:用户和密码,判断用户名密码是否正确。
  /*
    var username, password string
    fmt.Print("请输入用户名:")
    fmt.Scanln(&username)
    fmt.Print("请输入密码:")
    fmt.Scanln(&password)
    if username == "alex" && password == "sb" {
      fmt.Println("欢迎登录pornhub")
    } else {
      fmt.Println("用户名或密码错误")
    }
  */
  // 练习题4:请输入用户名校验是否是VIP
  /*
    var username string
    fmt.Print("请输入用户名:")
    fmt.Scanln(&username)
    if username == "snow" || username == "马云" {
      fmt.Println("上等客房")
    } else {
      fmt.Println("轰出去")
    }
  */
}

8.2 多条件判断

if 条件A{
    ...
}else if 条件B{
    ...
}else if 条件C{
    ...
}else{
    ...
}

示例:

package main
import "fmt"
func main() {
  var length int
  fmt.Print("请输入你的年龄:")
  fmt.Scanln(&length)
  if length < 1 {
    fmt.Println("小孩子")
  } else if length < 6 {
    fmt.Println("大孩子")
  } else if length < 18 {
    fmt.Println("快是大人了")
  } else {
    fmt.Println("大人")
  }
}

8.3 嵌套

package main
import "fmt"
func main() {
  fmt.Println("欢迎致电10086,1.话费相关;2.业务办理;3.人工服务。")
  var number int
  fmt.Scanln(&number)
  if number == 1 {
    fmt.Println("话费服务,1.交话费;2.查询。")
    var n1 int
    fmt.Scanln(&n1)
    if n1 == 1 {
      fmt.Println("缴话费啦")
    } else if n1 == 2 {
      fmt.Println("查话费了")
    } else {
      fmt.Println("输入错误")
    }
  } else if number == 2 {
    fmt.Println("业务办理")
  } else if number == 3 {
    fmt.Println("人工服务")
  } else {
    fmt.Println("输入错误")
  }
  // 建议:条件的嵌套不要太多
}

9. 荐书 《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》

微信截图_20231016222111.png

微信截图_20231016222122.png

9.1 内容简介

主要内容


● 编写命令行应用程序


● 编写HTTP服务和客户端


● 使用gRPC编写RPC应用程序


● 为网络客户端和服务器编写中间件


● 在云对象存储和SQL数据库中存储数据


● 使用惯用的技术测试应用程序


● 为应用程序增加可观察性


● 管理应用程序的配置数据


9.2 作者简介

Amit Saha 是位于澳大利亚悉尼市的Atlassian公司的高级DevOps工程师。Amit曾撰写Doing Math with Python: Use Programming to Explore Algebra, Statistics, Calculus, and More!和Write Your First Program等书籍。Amit已在软件行业工作10年,曾加盟Sun Microsystems、RedHat和多家初创公司。Amit在技术杂志、会议论文集和研究期刊上发表过大量文章。


9.3 目录

第1章 编写命令行应用程序 1


1.1 我们的第一个应用程序 1


1.2 编写单元测试 8


1.3 使用flag包 14


1.4 改进用户界面 22


1.4.1 删除重复的错误消息 22


1.4.2 自定义用例消息 23


1.4.3 通过位置参数接收姓名 24


1.5 更新单元测试 27


1.6 小结 32


第2章 高级命令行应用程序 33


2.1 实现子命令 33


2.1.1 子命令驱动的应用程序架构 37


2.1.2 测试main包 43


2.1.3 测试cmd包 45


2.2 使应用程序更健壮 47


2.2.1 带有超时的用户输入 48


2.2.2 处理用户信号 51


2.3 小结 55


第3章 编写HTTP客户端 57


3.1 下载数据 57


3.2 反序列化接收到的数据 61


3.3 发送数据 65


3.4 使用二进制数据 71


3.5 小结 78


第4章 高级HTTP客户端 79


4.1 使用自定义HTTP客户端 79


4.1.1 从过载的服务器下载 79


4.1.2 测试超时行为 83


4.1.3 配置重定向行为 86


4.2 定制请求 89


4.3 实现客户端中间件 90


4.3.1 了解RoundTripper接口 90


4.3.2 日志中间件 91


4.3.3 给所有请求添加一个标头 94


4.4 连接池 97


4.5 小结 101


第5章 构建HTTP服务器 103


5.1 我们的第一个HTTP服务器 103


5.2 设置请求处理程序 106


处理程序 106


5.3 测试服务器 109


5.4 Request(请求)结构 112


5.4.1 方法 112


5.4.2 URL 112


5.4.3 Proto、ProtoMajor和ProtoMinor 113


5.4.4 标头 113


5.4.5 主机 113


5.4.6 正文 113


5.4.7 Form、PostForm 113


5.4.8 MultipartForm 114


5.5 将元数据附加到请求 115


5.6 处理流请求 118


5.7 将流数据作为响应 123


5.8 小结 128


第6章 高级HTTP服务器应用程序 129


6.1 处理程序的类型 129


6.2 跨处理程序共享数据 130


6.3 编写服务器中间件 135


6.3.1 自定义HTTP处理程序技术 135


6.3.2 HandlerFunc技术 136


6.3.3 链接中间件 138


6.4 为复杂的服务器应用程序编写测试 142


6.4.1 组织代码 143


6.4.2 测试处理程序 148


6.4.3 测试中间件 151


6.4.4 测试服务器启动 153


6.5 小结 155


第7章 生产级HTTP服务器 157


7.1 终止请求处理 157


7.1.1 终止请求处理的策略 160


7.1.2 处理客户端断开连接 165


7.2 服务器范围的超时 168


7.2.1 为所有处理程序实现超时 169


7.2.2 实现服务器超时 169


7.3 实施优雅的关机 174


7.4 使用TLS保护通信 178


7.4.1 配置TLS和HTTP/2 179


7.4.2 测试TLS服务器 183


7.5 小结 186


第8章 使用gRPC构建RPC应用程序 187


8.1 gRPC和协议缓冲区 187


8.2 编写第一个服务 190


8.2.1 编写服务器 192


8.2.2 编写一个客户端 196


8.2.3 测试服务器 201


8.2.4 测试客户端 204


8.3 protobuf消息的详细介绍 207


8.3.1 序列化和反序列化 207


8.3.2 向前和向后兼容 212


8.4 多个服务 214


8.5 错误处理 219


8.6 小结 221


第9章 高级gRPC应用 223


9.1 流通信 223


9.1.1 服务器端流传输 223


9.1.2 客户端流传输 231


9.1.3 双向流 233


9.2 接收和发送任意字节 241


9.3 使用拦截器实现中间件 250


9.3.1 客户端拦截器 251


9.3.2 服务器端拦截器 257


9.3.3 包装流 262


9.3.4 链接拦截器 264


9.4 小结 265


第10章 生产级gRPC应用 267


10.1 使用TLS保护通信 267


10.2 服务器健壮性 270


10.2.1 实施健康检查 270


10.2.2 处理运行时错误 277


10.2.3 终止请求处理 280


10.3 客户端健壮性 289


10.3.1 提高连接配置 289


10.3.2 处理瞬态故障 291


10.3.3 为方法调用设置超时 296


10.4 连接管理 297


10.5 小结 299


第11章 使用数据存储 301


11.1 使用对象存储 302


11.1.1 与包服务器集成 303


11.1.2 测试包上传 312


11.1.3 访问底层驱动类型 315


11.2 使用关系数据库 316


11.2.1 与包服务器集成 318


11.2.2 测试数据存储 328


11.2.3 数据类型转换 332


11.2.4 使用数据库事务 335


11.3 小结 337


—— 以下部分通过扫描封底二维码获取 ——


附录A 使应用程序可观察 339


附录B 部署应用程序 356


附录C 配置Go开发环境 362

相关文章
|
数据采集 缓存 数据挖掘
什么是代理IP?代理IP有什么用途
什么是代理IP?代理IP有什么用途
488 0
|
8月前
|
人工智能 JavaScript 前端开发
《鸿蒙Next ArkTS:开启人工智能应用开发高效新旅程》
在科技飞速发展的时代,人工智能与鸿蒙Next的结合成为开发者关注的焦点。ArkTS语言基于TypeScript,专为鸿蒙系统优化,支持静态类型检查和多种高级类型,能捕获潜在错误并充分利用鸿蒙底层能力。鸿蒙Next拥有微内核架构和分布式软总线技术,提供强大支持。开发环境搭建需安装Node.js、npm及DevEco Studio,并下载HarmonyOS SDK。通过引入HUAWEI HiAI等框架,开发者可实现多目标识别等功能。利用ArkTS的异步编程能力和声明式UI模型,可高效处理数据和用户交互。性能优化策略包括静态类型检查、WebAssembly加速及分布式任务分配。
238 11
|
8月前
|
算法 决策智能
基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法
本项目基于MATLAB2022A,使用模拟退火(SA)和蚁群优化(ACO)算法求解旅行商问题(TSP),对比两者的仿真时间、收敛曲线及最短路径长度。SA源于金属退火过程,允许暂时接受较差解以跳出局部最优;ACO模仿蚂蚁信息素机制,通过正反馈发现最优路径。结果显示SA全局探索能力强,ACO在路径优化类问题中表现优异。
|
10月前
|
机器学习/深度学习 Python
机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况
本文介绍了机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况,而ROC曲线则通过假正率和真正率评估二分类模型性能。文章还提供了Python中的具体实现示例,展示了如何计算和使用这两种工具来评估模型。
389 8
|
11月前
|
NoSQL 关系型数据库 分布式数据库
凭安征信携手阿里云PolarDB和MongoDB,挖掘信用背后的数据金矿
PolarDB和MongoDB共同支撑凭安征信的全量数据需求
|
存储 缓存 Unix
sar命令详解
`sar`是Linux性能分析工具,用于收集和报告CPU使用率、内存、磁盘I/O、网络和进程活动等系统性能数据。基本语法:`sar [options] [interval] [count]`。例如,`sar -u 5`每5秒显示CPU使用情况。`-A`显示所有报告,`-o file`将结果保存到文件。要使用`sar`,需先安装`sysstat`包。不同发行版支持的选项可能有差异,建议查阅手册页。
294 2
|
Linux
2021Kali系列 -- Kali安装与配置
2021Kali系列 -- Kali安装与配置
375 1
|
存储 定位技术 开发工具
商业模式画布
商业模式画布
469 0
|
JavaScript 前端开发 数据库
【Vue】vue如何将秒数转成“时分秒”格式
【Vue】vue如何将秒数转成“时分秒”格式
395 0