当前位置: 首页 > 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;只保留一些对外接口使之与外部发生联系。…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...