当前位置: 首页 > news >正文

GO 语言基础语法一 (快速入门 Go 语言)

Go语言基础语法

  • 一. golang 标识符,关键字,命名规则
  • 二. golang 变量
  • 三. golang 常量
  • 四. golang 数据类型
  • 五. golang 布尔类型
  • 六. golang 数字类型
  • 七. golang 字符串
    • 1. go语言字符串字面量
    • 2. go语言字符串连接
      • (1). 使用加号
      • (2). 使用 fmt.Sprintf() 函数
      • (3). strings.Join()
      • (4). buffer.WriteString()
    • 3. go语言字符串转义字符
    • 4. go语言字符串切片操作
    • 5. go语言字符串常用方法
  • 八. golang格式化输出
  • 九. golang运算符
    • 1. 算术运算符
    • 2. 关系运算符
    • 3. 逻辑运算符
    • 4. 位运算符
    • 5. 赋值运算符
  • 十. golang流程控制
    • 1. if 语句
    • 2. if else 语句
    • 3. if else if 语句
    • 4. 嵌套 if 语句
    • 4. switch语句
    • 5. for 循环语句
    • 6. for range 循环语句

一. golang 标识符,关键字,命名规则

在这里插入图片描述

二. golang 变量

在这里插入图片描述

三. golang 常量

在这里插入图片描述

四. golang 数据类型

在这里插入图片描述

五. golang 布尔类型

在这里插入图片描述

六. golang 数字类型

在这里插入图片描述

七. golang 字符串

1. go语言字符串字面量

在Go语言中,字符串字面量使用双引号 “” 或者反引号 ’ 来创建。双引号用来创建可解析的字符串,支持转义,但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。双引号创建可解析的字符串应用最广泛,反引号用来创建原生的字符串则多用于书写多行消息,HTML以及正则表达式。

package mainimport ("fmt"
)func main() {var s1 string = "hello world"var s2 string = `<html><head><title> hello world </title></html>`fmt.Printf("s1: %v\n", s1)fmt.Printf("s2: %v\n", s2)
}

运行结果

s1: hello world
s2: <html><head><title> hello world </title></html>

2. go语言字符串连接

(1). 使用加号

package mainimport ("fmt"
)func main() {name := "lyp"age := "20"msg := name + " is " + agefmt.Printf("msg: %v\n", msg)msg = ""msg += namemsg += " is "msg += agefmt.Printf("msg: %v\n", msg)}

运行结果

msg: lyp is 20
msg: lyp is 20

(2). 使用 fmt.Sprintf() 函数

package mainimport ("fmt"
)func main() {name := "lyp"age := "20"msg := fmt.Sprintf("%s is %s", name, age)fmt.Printf("msg: %v\n", msg)}

运行结果

msg: lyp is 20

(3). strings.Join()

package mainimport ("fmt""strings"
)func main() {name := "lyp"age := "20"msg := strings.Join([]string{name, age}, " is ")fmt.Printf("msg: %v\n", msg)}

运行结果

msg: lyp is 20

(4). buffer.WriteString()

package mainimport ("bytes""fmt"
)func main() {var buffer bytes.Bufferbuffer.WriteString("lyp")buffer.WriteString(" is ")buffer.WriteString("20")fmt.Printf("buffer.String(): %v\n", buffer.String())}

运行结果

buffer.String(): lyp is 20

3. go语言字符串转义字符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示
在这里插入图片描述

package mainimport "fmt"func main() {fmt.Printf("hello\tworld\n")fmt.Printf("\"c:\\test\\\"")}

运行结果

hello   world
"c:\test\"

4. go语言字符串切片操作

package mainimport "fmt"func main() {str := "hello world"n := 3m := 5fmt.Println(str[n])   //获取字符串索引位置为n的原始字节fmt.Println(str[n:m]) //截取得字符串索引位置为 n 到 m-1 的字符串fmt.Println(str[n:])  //截取得字符串索引位置为 n 到 len(s)-1 的字符串fmt.Println(str[:m])  //截取得字符串索引位置为 0 到 m-1 的字符串}

运行结果

108
lo
lo world
hello

5. go语言字符串常用方法

在这里插入图片描述

package mainimport ("fmt""strings"
)func main() {s := "hello world!"fmt.Printf("len(s): %v\n", len(s))fmt.Printf("strings.Split(s, \"\"): %v\n", strings.Split(s, " "))fmt.Printf("strings.Contains(s, \"hello\"): %v\n", strings.Contains(s, "hello"))fmt.Printf("strings.HasPrefix(s, \"hello\"): %v\n", strings.HasPrefix(s, "hello"))fmt.Printf("strings.HasSuffix(s, \"world!\"): %v\n", strings.HasSuffix(s, "world!"))fmt.Printf("strings.Index(s, \"l\"): %v\n", strings.Index(s, "l"))fmt.Printf("strings.LastIndex(s, \"l\"): %v\n", strings.LastIndex(s, "l"))
}

运行结果

len(s): 14
strings.Split(s, ""): [hello world!]
strings.Contains(s, "hello"): true
strings.HasPrefix(s, "hello"): true
strings.HasSuffix(s, "world!"): true
strings.Index(s, "l"): 2
strings.LastIndex(s, "l"): 9

八. golang格式化输出

在这里插入图片描述

package mainimport "fmt"type WebSite struct {Name string
}func main() {site := WebSite{Name: "lyp"}fmt.Printf("site: %v\n", site)fmt.Printf("site: %#v\n", site)fmt.Printf("site: %T\n", site)fmt.Println("%%")b := truefmt.Printf("b: %t\n", b)i := 8fmt.Printf("i: %v\n", i)fmt.Printf("i: %b\n", i)i = 96fmt.Printf("i: %c\n", i)fmt.Printf("i: %x\n", i)x := 100p := &xfmt.Printf("p: %v\n", p)}

运行结果

site: {lyp}
site: main.WebSite{Name:"lyp"}
site: main.WebSite
%%
b: true
i: 8
i: 1000
i: `
i: 60
p: 0xc000016120

九. golang运算符

1. 算术运算符

在这里插入图片描述

++(自增)和–(自减)在Go语言中是单独的语句,并不是运算符(不能用在表达式中)

package mainimport "fmt"func main() {a := 100b := 10fmt.Printf("(a + b): %v\n", (a + b))fmt.Printf("(a - b): %v\n", (a - b))fmt.Printf("(a * b): %v\n", (a * b))fmt.Printf("(a / b): %v\n", (a / b))fmt.Printf("(a %% b): %v\n", (a % b))a++fmt.Printf("a: %v\n", a)b--fmt.Printf("b: %v\n", b)
}

2. 关系运算符

在这里插入图片描述

package mainimport "fmt"func main() {a := 1b := 2fmt.Printf("(a > b): %v\n", (a > b))fmt.Printf("(a < b): %v\n", (a < b))fmt.Printf("(a >= b): %v\n", (a >= b))fmt.Printf("(a <= b): %v\n", (a <= b))fmt.Printf("(a == b): %v\n", (a == b))fmt.Printf("(a != b): %v\n", (a != b))
}

3. 逻辑运算符

在这里插入图片描述

package mainimport "fmt"func main() {a := trueb := falsefmt.Printf("(a && b): %v\n", (a && b))fmt.Printf("(a || b): %v\n", (a || b))fmt.Printf("(!a): %v\n", (!a))fmt.Printf("(!b): %v\n", (!b))
}

4. 位运算符

在这里插入图片描述

package mainimport "fmt"func main() {a := 4 // 二进制 100fmt.Printf("a: %b\n", a)b := 8 // 二进制 1000fmt.Printf("b: %b\n", b)fmt.Printf("(a & b): %v, %b \n", (a & b), (a & b))fmt.Printf("(a | b): %v, %b\n", (a | b), (a | b))fmt.Printf("(a ^ b): %v, %b\n", (a ^ b), (a ^ b))fmt.Printf("(a << 2): %v, %b\n", (a << 2), (a << 2))fmt.Printf("(b >> 2): %v, %b\n", (b >> 2), (b >> 2))
}

5. 赋值运算符

在这里插入图片描述

package mainimport "fmt"func main() {var a inta = 100fmt.Printf("a: %v\n", a)a += 1 // a = a + 1fmt.Printf("a: %v\n", a)a -= 1 // a = a -1fmt.Printf("a: %v\n", a)a *= 2 // a = a * 2fmt.Printf("a: %v\n", a)a /= 2 // a = a / 2fmt.Printf("a: %v\n", a)
}

十. golang流程控制

1. if 语句

if 布尔表达式 {/* 在布尔表达式为 true 时执行 */
}

(1). 不需使用括号将条件包含起来
(2). 大括号{}必须存在,即使只有一行语句
(3). 左括号必须在if或else的同一行
(4). 在if之后,条件语句之前,可以添加变量初始化语句,使用;进行分隔
(5). 不能使用0或非0表示真假

func test3() {if age := 20; age > 18 {fmt.Println("你是成年人")}fmt.Printf("程序运行结束")
}func main() {// test1()// test2()test3()
}
func test4() {var i = 1if i { // 编译失败fmt.Println("here")}fmt.Printf("程序运行结束")
}

2. if else 语句

if 布尔表达式 {/* 在布尔表达式为 true 时执行 */
} else {/* 在布尔表达式为 false 时执行 */
}
func f2() {var s intfmt.Println("输入一个数字:")fmt.Scan(&s)if s%2 == 0 {fmt.Print("s 是偶数\n")} else {fmt.Print("s 不是偶数\n")}fmt.Print("s 的值是:", s)
}

3. if else if 语句

if 布尔表达式1 {// do something
} else if 布尔表达式2 {// do something else
}else {// catch-all or default
}
func f5() {if score := 80; score >= 60 && score <= 70 {fmt.Println("C")} else if score > 70 && score <= 90 {fmt.Println("B")} else {fmt.Println("A")}
}

4. 嵌套 if 语句

if 布尔表达式 1 {/* 在布尔表达式 1 为 true 时执行 */if 布尔表达式 2 {/* 在布尔表达式 2 为 true 时执行 */}
}
func f2() {// 判断男女生及年龄gender := "女生"age := 16if gender == "男生" {fmt.Println("男生")if age > 18 {fmt.Println("成年")} else {fmt.Println("未成年")}} else {fmt.Println("女生")if age > 18 {fmt.Println("成年")} else {fmt.Println("未成年")}}
}

4. switch语句

switch var1 {case val1:...case val2:...default:...
}
func f() {grade := "A"switch grade {case "A":fmt.Println("优秀")case "B":fmt.Println("良好")default:fmt.Println("一般")}
}

多条件匹配

func f() {day := 3switch day {case 1, 2, 3, 4, 5:fmt.Println("工作日")case 6, 7:fmt.Println("休息日")}
}

case 可以是条件表达式

func f() {score := 90switch {case score >= 90:fmt.Println("享受假期")case score < 90 && score >= 80:fmt.Println("好好学习吧!")default:fmt.Println("玩命学习!")}
}

fallthrough 强制执行后面的一个 case 代码
fallthrough 不能用在switch的最后一个分支

switch {case false:fmt.Println("The integer was <= 4")fallthroughcase true:fmt.Println("The integer was <= 5")fallthroughcase false:fmt.Println("The integer was <= 6")fallthroughcase true:fmt.Println("The integer was <= 7")fallthroughcase false:fmt.Println("The integer was <= 8")default:fmt.Println("default case")
}

5. for 循环语句

go语言中的 for 循环,只有 for 关键字,去除了像其他语言中的 while 和 do while

for 初始语句;条件表达式;结束语句{循环体语句
}
func f() {for i := 1; i <= 10; i++ {fmt.Printf("i: %v\n", i)}
}func f() {i := 1for ; i <= 10; i++ {fmt.Printf("i: %v\n", i)}
}func f() {i := 1 // 初始条件for i <= 10 {fmt.Printf("i: %v\n", i)i++ // 结束条件}
}

for循环可以通过 break goto return panic 语句强制退出循环。

6. for range 循环语句

Go语言中可以使用 for range 遍历数组、切片、字符串、map 及通道(channel)。通过for range遍历的返回值有以下规律

1.数组、切片、字符串返回索引和值。
2.map返回建和值。
3.通道(channel)只返回通道内的值。

// 循环数组
func f() {var a = [5]int{1, 2, 3, 4, 5}for i, v := range a {fmt.Printf("i: %d, v: %v\n", i, v)}
}func main() {f()
}// 循环字符串
func f() {var s = "多课网,go教程"for i, v := range s {fmt.Printf("i: %d, v: %c\n", i, v)}// %c 按照字符输出
}func main() {f()
}// 循环切片
func f() {var s = []int{1, 2, 3, 4, 5}for i, v := range s {fmt.Printf("i, %d, v: %v\n", i, v)}
}func main() {f()
}// 循环 map
func f() {m := make(map[string]string)m["name"] = "tom"m["age"] = "20"m["email"] = "tom@gmail.com"for k, v := range m {fmt.Printf("k: %v, v: %v\n", k, v)}
}func main() {f()
}

相关文章:

GO 语言基础语法一 (快速入门 Go 语言)

Go语言基础语法一. golang 标识符&#xff0c;关键字&#xff0c;命名规则二. golang 变量三. golang 常量四. golang 数据类型五. golang 布尔类型六. golang 数字类型七. golang 字符串1. go语言字符串字面量2. go语言字符串连接(1). 使用加号(2). 使用 fmt.Sprintf() 函数(3…...

Java高效率复习-SpringMVC[SpringMVC-2]

SpringMVC获取请求参数 SpringMVC获取请求参数的两种方式↓ 通过ServletAPI获取请求参数 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 通过request的API——getParameter(String s)方法来获取…...

【前端】一个更底层库-React基础知识点

目录Reat是什么&#xff1f;为什么要使用React类库比较容易学习&#xff0c;API非常少。组件内聚&#xff0c;容易组合原生组件和自定义组件融合渲染状态/属性驱动全局更新commonjs生态圈/工具栏完善React基础知识JSX概述JSX嵌入变量Event事件组合组合CHILDREN总结大家好&#…...

C++ 之枚举类型

文章目录参考描述枚举类型枚举类型枚举变量的声明及定义细节枚举常量的默认初始值枚举常量不可被修改赋值运算枚举常量与数据类型为枚举常量指定数据类型可选择的数据类型特殊的 Bool强枚举类型命名冲突强枚举类型参考 项目描述菜鸟教程C 枚举类型详解精通C &#xff08;第九版…...

软件测试用例(3)

按照测试对象划分: 一)界面测试: 1)软件只是一种工具&#xff0c;软件和人的信息交流是通过界面来进行的&#xff0c;界面是软件和用户交流的最直接的一层&#xff0c;界面的设计决定了用户对于我们设计软件的第一映像&#xff0c;界面如同人的面孔&#xff0c;具有最吸引用户的…...

Spring——Bean管理-注解方式进行属性注入

Spring针对Bean管理中创建对象提供的注解有哪些&#xff1f;Component&#xff1a;普通Service&#xff1a;业务逻辑层Controller&#xff1a;controller层Repository&#xff1a;dao层用注解的方式是为什么&#xff1f;简化xml方式开发&#xff0c;只需要注解就可以完成在配置…...

【设计模式之美 设计原则与思想:设计原则】20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?

上几节课中&#xff0c;我们学习了经典的 SOLID 原则。今天&#xff0c;我们讲两个设计原则&#xff1a;KISS 原则和 YAGNI 原则。其中&#xff0c;KISS 原则比较经典&#xff0c;耳熟能详&#xff0c;但 YAGNI 你可能没怎么听过&#xff0c;不过它理解起来也不难。 理解这两个…...

Java代码弱点与修复之——Copy-paste error(复制粘贴错误)

弱点描述 Copy-paste error,复制粘贴错误。 是指在复制和粘贴代码时产生的错误。这种错误通常是由于程序员在复制代码时未正确编辑所复制的代码或编辑复制后的代码时忘记更改一些值或参数而导致的。复制粘贴错误可能会导致程序逻辑错误、编译错误或运行时错误。 示例代码 …...

Editor.md 的使用方法及图片处理

目录1. 资源下载2. 生成页面2.1 编辑和预览页面2.2 文本渲染页面3. 图片上传3.1 前端配置3.2 后端接口4. 图片粘贴[^2]1. 资源下载 官网下载 gitee 下载 2. 生成页面 2.1 编辑和预览页面 将资源&#xff08;精简后 Editor.md 资源1&#xff09;导入项目&#xff1a; 按照官…...

剑指 Offer II 018. 有效的回文

题目链接 剑指 Offer II 018. 有效的回文 easy 题目描述 给定一个字符串 s&#xff0c;验证 s是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 本题中&#xff0c;将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, …...

Elasticsearch分析器(Analyzer)

Elasticsearch分析器&#xff08;Analyzer&#xff09; 文章目录Elasticsearch分析器&#xff08;Analyzer&#xff09;分析器概念内置分析器&#xff08;8.6版本&#xff09;自定义分析器elasticsearch-analysis-ik&#xff08;简称ik&#xff0c;&#x1f495;14.8k&#xff…...

P6入门:了解P6 Professional 工具栏及地图分享

目录 引言 相关分享 引言 凭借更大的灵活性和增强的自定义功能&#xff0c;最新版本的 Oracle Primavera P6 Professional 的界面比早期版本有了巨大改进。对于有经验的伙伴来说&#xff0c;它仍然是熟悉的领域&#xff0c;几乎所有预期的功能都显示在前面。该界面可以更好地…...

习题30 if elif else 语句

people 30#变量people赋值30 cars 40#变量cars赋值40 buses 15#变量buses赋值 if cars > people:#如果出租车比人多print("We should take the cars")#我们坐出租车 elif cars < people:#elif后面必须跟条件&#xff0c;print("We should not take the…...

32 openEuler使用LVM管理硬盘-管理卷组

文章目录32 openEuler使用LVM管理硬盘-管理卷组32.1 创建卷组32.2 查看卷组32.3 修改卷组属性32.4 扩展卷组32.5 收缩卷组32.6 删除卷组32 openEuler使用LVM管理硬盘-管理卷组 32.1 创建卷组 可在root权限下通过vgcreate命令创建卷组。 vgcreate [option] vgname pvname ...…...

Jackson CVE-2017-17485 反序列化漏洞

0x00 前言 同CVE-2017-15095一样&#xff0c;是CVE-2017-7525黑名单绕过的漏洞&#xff0c;主要还是看一下绕过的调用链利用方式。 可以先看&#xff1a; Jackson 反序列化漏洞原理 或者直接看总结也可以&#xff1a; Jackson总结 涉及版本&#xff1a;2.8.10和2.9.x至2.…...

十大排序(C++版)

测试排序的题目&#xff1a; 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 堕落的做法&#xff1a; class Solution { public:vector<int> sortArray(vector<int>& nums) {sort(nums.begin(),nums.end());return nums;} };视频推荐&#xff1a; …...

SpringMVC中的常用注解

Java知识点总结&#xff1a;想看的可以从这里进入 目录3.2、常用的注解3.2、常用的注解 Controller&#xff1a;代表此类是一个控制器&#xff0c;需要配置包的扫描。Spring MVC 是通过组件扫描机制查找应用中的控制器类的 在Spring6.0之后要求控制层必须添加该注解才会被识别成…...

English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一

English Learning - L2-3 英音地道语音语调 小元音 [ʌ] [ɒ] [ʊ] [ɪ] [ə] [e] 2023.02.27 周一课前活动练习方法大小元音总结小元音准备工作[ʌ] 中元音发音技巧对应单词的发音对应句子的发音常见的字母组合[ɒ] 后元音发音技巧对应单词的发音对应句子的发音常见的字母组合…...

fastadmin后台登录页修改

直接替换就行 <!DOCTYPE html> <html lang"{$config.language}"> <head>{include file"common/meta" /}<style type"text/css">body {color: #999;background-color: #f1f4fd;background-size: cover;}a {color: #444;…...

Java 面向对象(OOP)的三大特性

封装 所谓封装&#xff0c;意思就是隐藏内部细节&#xff0c;在编程中&#xff0c;指利用抽象数据类型将数据和基于数据的操作封装在一起&#xff0c;使其构成一个不可分割的独立实体&#xff0c;并尽可能地隐藏内部的细节&#xff0c;只保留一些对外接口使之与外部发生联系。…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

【java面试】微服务篇

【java面试】微服务篇 一、总体框架二、Springcloud&#xff08;一&#xff09;Springcloud五大组件&#xff08;二&#xff09;服务注册和发现1、Eureka2、Nacos &#xff08;三&#xff09;负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...