Go第 6 章:函数、包和错误处理

news2024/11/8 8:57:10

Go第 6 章:函数、包和错误处理

6.1 为什么需要函数

6.1.1请大家完成这样一个需求:

输入两个数,再输入一个运算符(+,-,*,/),得到结果.。

6.1.2使用传统的方法解决

请添加图片描述
分析一下上面代码问题

  1. 上面的写法是可以完成功能, 但是代码冗余
  2. 同时不利于代码维护
  3. 函数可以解决这个问题

6.2 函数的基本概念

为完成某一功能的程序指令(语句)的集合,称为函数。
在 Go中,函数分为: 自定义函数、系统函数(查看 Go 编程手册)

6.3 函数的基本语法

请添加图片描述

6.4 快速入门案例

使用函数解决前面的计算问题。
请添加图片描述
请添加图片描述

6.5 包的引出

    1. 在实际的开发中,我们往往需要在不同的文件中,去调用其它文件的定义的函数,比如 main.go 中,去使用 utils.go 文件中的函数,如何实现? -》包
    1. 现在有两个程序员共同开发一个 Go 项目,程序员 xiaoming 希望定义函数 Cal ,程序员 xiaoqiang 也想定义函数也叫 Cal。两个程序员为此还吵了起来,怎么办? -》包

6.6 包的原理图

包的本质实际上就是创建不同的文件夹,来存放程序文件。 画图说明一下包的原理
请添加图片描述

请添加图片描述

6.7 包的基本概念

说明:go 的每一个文件都是属于一个包的,也就是说 go 是以包的形式来管理文件和项目目录结构的

6.8 包的三大作用

区分相同名字的函数、变量等标识符
当程序文件很多时,可以很好的管理项目 控制函数、变量等访问范围,即作用域

6.9 包的相关说明

请添加图片描述

6.10 包使用的快速入门

包快速入门-Go 相互调用函数,我们将 func Cal 定义到文件 utils.go , 将 utils.go 放到一个包中,当 其它文件需要使用到 utils.go 的方法时,可以 import 该包,就可以使用了. 【为演示:新建项目目录结构】

代码演示:
请添加图片描述
utils.go 文件

为了让其它包的文件使用cal函数,需要将C大写,类似其他语言的public。表示该函数可导出请添加图片描述main.go 文件请添加图片描述

6.11 包使用的注意事项和细节讨论

  1. 在给一个文件打包时,该包对应一个文件夹,比如这里的 utils 文件夹对应的包名就是 utils,
    文件的包名通常和文件所在的文件夹名一致,一般为小写字母
  2. 当一个文件要使用其它包函数或变量时,需要先引入对应的包
    请添加图片描述
  3. 为了让其它包的文件,可以访问到本包的函数,则该函数名的首字母需要大写,类似其它语言 的 public ,这样才能跨包访问。比如 utils.go 的
    请添加图片描述
  4. 在访问其它包函数,变量时,其语法是 包名.函数名, 比如这里的 main.go 文件中
    请添加图片描述
  5. 如果包名较长,Go 支持给包取别名, 注意细节:取别名后,原来的包名就不能使用了
    请添加图片描述
    说明: 如果给包取了别名,则需要使用别名来访问该包的函数和变量。
  6. 在同一包下,不能有相同的函数名(也不能有相同的全局变量名),否则报重复定义 7) 如果你要编译成一个可执行程序文件,就需要将这个包声明为 main , 即 package main .这个就
    是一个语法规范,如果你是写一个库 ,包名可以自定义
    请添加图片描述

6.12 函数的调用机制

6.12.1 通俗易懂的方式的理解

请添加图片描述

6.12.2 函数-调用过程

介绍:为了让大家更好的理解函数调用过程, 看两个案例,并画出示意图,这个很重要

  1. 传入一个数+1
    请添加图片描述
    对上图说明
  • (1) 在调用一个函数时,会给该函数分配一个新的空间,编译器会通过自身的处理让这个新的空间 和其它的栈的空间区分开来
  • (2) 在每个函数对应的栈中,数据空间是独立的,不会混淆 (3) 当一个函数调用完毕(执行完毕)后,程序会销毁这个函数对应的栈空间。
  1. 计算两个数,并返回
    请添加图片描述

6.12.3 return 语句

请添加图片描述
请添加图片描述
请添加图片描述

6.13 函数的递归调用

6.13.1 基本介绍

一个函数在函数体内又调用了本身,我们称为递归调用

6.13.2 递归调用快速入门

请添加图片描述
请添加图片描述
代码2
请添加图片描述
请添加图片描述

6.13.3 递归调用的总结

函数递归需要遵守的重要原则:

  1. 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈) 2) 函数的局部变量是独立的,不会相互影响 3) 递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:) 4) 当一个函数执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当
    函数执行完毕或者返回时,该函数本身也会被系统销毁

6.13.4 递归课堂练习题

 题 1:斐波那契数
请使用递归的方式,求出斐波那契数 1,1,2,3,5,8,13…
给你一个整数 n,求出它的斐波那契数是多少?
思路:

  1. 当 n == 1 || n ==2 , 返回 1
  2. 当 n >= 2, 返回 前面两个数的和 f(n-1) + f(n-2)
    代码:
    请添加图片描述
    题 2:求函数值
    已知 f(1)=3; f(n) = 2*f(n-1)+1;
    请使用递归的思想编程,求出 f(n)的值?
    思路:
    请添加图片描述
    请添加图片描述
    思路分析:
  3. 第 10 天只有一个桃子
  4. 第 9 天有几个桃子 = (第 10 天桃子数量 + 1) * 2
  5. 规律: 第 n 天的桃子数据 peach(n) = (peach(n+1) + 1) * 2
    代码:
    请添加图片描述

6.14 函数使用的注意事项和细节讨论

  1. 函数的形参列表可以是多个,返回值列表也可以是多个。
  2. 形参列表和返回值列表的数据类型可以是值类型和引用类型。
  3. 函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其 它包文件使用,类似 public , 首字母小写,只能被本包文件使用,其它包文件不能使用,类似 privat
  4. 函数中的变量是局部的,函数外不生效【案例说明】
    请添加图片描述
  5. 基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
    请添加图片描述
  6. 如果希望函数内的变量能修改函数外的变量(指的是默认以值传递的方式的数据类型),可以传 入变量的地址&,函数内以指针的方式操作变量。从效果上看类似引用 。
    请添加图片描述
  7. Go 函数不支持函数重
    请添加图片描述
  8. 在 Go 中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量 了。通过该变量可以对函数调用
    请添加图片描述
  9. 函数既然是一种数据类型,因此在 Go 中,函数可以作为形参,并且调用
    请添加图片描述
  10. 为了简化数据类型定义,Go 支持自定义数据类型
    基本语法:type 自定义数据类型名 数据类型 // 理解: 相当于一个别名
    案例:type myInt int // 这时 myInt 就等价 int 来使用了.
    案例:type mySum func (int, int) int // 这时 mySum 就等价 一个 函数类型 func (int, int) int
    举例说明自定义数据类型的使用:
    请添加图片描述
  11. 支持对函数返回值命名

对返回值命名之后,return后边可以不加任何东西,且之前的顺序无所谓了。且sub=xxx而不用sub:=xxx

请添加图片描述

请添加图片描述
12) 使用 _ 标识符,忽略返回值
请添加图片描述
13) Go 支持可变参数
请添加图片描述
(3) 如果一个函数的形参列表中有可变参数,则可变参数需要放在形参列表最后。 代码演示:
请添加图片描述

6.15 函数的课堂练习

请添加图片描述
请添加图片描述
题 3:请编写一个函数 swap(n1 *int, n2 *int) 可以交换 n1 和 n2 的值
请添加图片描述

6.16 init 函数

6.16.1 基本介绍

每一个源文件都可以包含一个 init 函数,该函数会在 main 函数执行前,被 Go 运行框架调用,也 就是说 init会在 main 函数前被调用。

6.16.2 案例说明:

请添加图片描述
请添加图片描述

6.16.3 inti 函数的注意事项和细节

  1. 如果一个文件同时包含全局变量定义,init 函数和 main 函数,则执行的流程全局变量定义->init函数->main 函数
    请添加图片描述

  2. init 函数最主要的作用,就是完成一些初始化的工作,比如下面的案例
    请添加图片描述
    请添加图片描述

3) 细节说明: 面试题:案例如果 main.go 和 utils.go 都含有 变量定义,init 函数时,执行的流程 又是怎么样的呢?

请添加图片描述

6.17 匿名函数 6.17.1 介绍

Go 支持匿名函数,匿名函数就是没有名字的函数,如果我们某个函数只是希望使用一次,可以考 虑使用匿名函数,匿名函数也可以实现多次调用。

6.17.2 匿名函数使用方式 1

在定义匿名函数时就直接调用,这种方式匿名函数只能调用一次。 【案例演示】
请添加图片描述

6.17.3 匿名函数使用方式 2

将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数 【案例演示】
请添加图片描述

6.17.4 全局匿名函数

如果将匿名函数赋给一个全局变量,那么这个匿名函数,就成为一个全局匿名函数,可以在程序有效。
请添加图片描述

6.18 闭包

6.18.1 介绍

基本介绍:闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)

6.18.2 案例演示:

请添加图片描述
对上面代码的说明和总结

  1. AddUpper 是一个函数,返回的数据类型是 fun (int) int

  2. 闭包的说明
    请添加图片描述

  3. 大家可以这样理解: 闭包是类, 函数是操作,n 是字段。函数和它使用到 n 构成闭包。

  4. 当我们反复的调用 f 函数时,因为 n 是初始化一次,因此每调用一次就进行累计。

  5. 我们要搞清楚闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引
    用到的变量共同构成闭包。

  6. 对上面代码的一个修改,加深对闭包的理解
    请添加图片描述

6.18.3 闭包的最佳实践

请编写一个程序,具体要求如下 1) 编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包 2) 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。 3) 要求使用闭包的方式完成 4) strings.HasSuffix , 该函数可以判断某个字符串是否有指定的后缀。

请添加图片描述
上面代码的总结和说明:

  1. 返回的匿名函数和 makeSuffix (suffix string) 的 suffix 变量组合成一个闭包,因为返回的函数引用到suffix这个变量
  2. 我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如 .jpg ,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把!

6.19 函数的 defer

6.19.1 为什么需要 defer

在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等) ,为了在函数执行完毕后,及时的释放资源,Go 的设计者提供 defer (延时机制)。

6.19.2 快速入门案例

请添加图片描述

6.19.3 defer 的注意事项和细节

  1. 当 go 执行到一个 defer 时,不会立即执行 defer 后的语句,而是将 defer 后的语句压入到一个栈
    中[我为了讲课方便,暂时称该栈为 defer 栈], 然后继续执行函数下一个语句。
  2. 当函数执行完毕后,在从 defer 栈中,依次从栈顶取出语句执行(注:遵守栈 先入后出的机制),所以同学们看到前面案例输出的顺序。
  3. 在 defer 将语句放入到栈时,也会将相关的值拷贝同时入栈。请看一段代码:
    请添加图片描述

6.19.4 defer 的最佳实践

defer 最主要的价值是在,当函数执行完毕后,可以及时的释放函数创建的资源。看下模拟代码。。
请添加图片描述

  1. 在 golang 编程中的通常做法是,创建资源后,比如(打开了文件,获取了数据库的链接,或者是 锁资源), 可以执行 defer file.Close() defer connect.Close()
  2. 在 defer 后,可以继续使用创建资源.
  3. 当函数完毕后,系统会依次从 defer 栈中,取出语句,关闭资源.
  4. 这种机制,非常简洁,程序员不用再为在什么时机关闭资源而烦心。

6.20 函数参数传递方式

6.20.1 基本介绍

我们在讲解函数注意事项和使用细节时,已经讲过值类型和引用类型了,这里我们再系统总结一 下,因为这是重难点,值类型参数默认就是值传递,而引用类型参数默认就是引用传递。

6.20.2 两种传递方式

  1. 值传递
  2. 引用传递
    其实,不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是地址的拷贝,一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。

6.20.3 值类型和引用类型

1) 值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct

2) 引用类型:**指针、slice 切片、map、管道 chan、interface 等都是引用类型

6.20.4 值传递和引用传递使用特点**

请添加图片描述
请添加图片描述

6.21 变量作用域

  1. 函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部
    请添加图片描述
  2. 函数外部声明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用 域在整个程序有效
    请添加图片描述
  3. 如果变量是在一个代码块,比如 for / if 中,那么这个变量的的作用域就在该代码块
    请添加图片描述

6.21.1 变量作用域的课堂练习

请添加图片描述
请添加图片描述

6.22 函数课堂练习(综合)

  1. 函数可以没有返回值案例,编写一个函数,从终端输入一个整数打印出对应的金子塔
    分析思路:就是将原来写的打印金字塔的案例,使用函数的方式封装,在需要打印时,直接调用即可。
    请添加图片描述
  2. 编写一个函数,从终端输入一个整数(1—9),打印出对应的乘法表 分析思路:就是将原来写的调用九九乘法表的案例,使用函数的方式封装,在需要打印时,直接调
    用即可
    代码:
    请添加图片描述
  3. 编写函数,对给定的一个二维数组(3×3)转置,这个题讲数组的时候再完成
    请添加图片描述

6.23 字符串常用的系统函数

说明:字符串在我们程序开发中,使用的是非常多的,常用的函数需要同学们掌握[带看手册或者 官方编程指南]:

  1. 统计字符串的长度,按字节 len(str)
    请添加图片描述
  2. 字符串遍历,同时处理有中文的问题 r := []rune(str)
    请添加图片描述
    请添加图片描述
    请添加图片描述
  3. 查找子串是否在指定的字符串中: strings.Contains(“seafood”, “foo”) //true
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

6.24 时间和日期相关函数

6.24.1 基本的介绍

说明:在编程中,程序员会经常使用到日期相关的函数,比如:统计某段代码执行花费的时间等 等。

  1. 时间和日期相关函数,需要导入 time 包
    请添加图片描述
  2. time.Time 类型,用于表示时间
    请添加图片描述
  3. 如何获取到其它的日期信息
    请添加图片描述
  4. 格式化日期时间
    方式 1: 就是使用 Printf 或者 SPrintf
    请添加图片描述
  5. 时间的常量
    const (
    Nanosecond Duration = 1 //纳秒
    Microsecond = 1000 * Nanosecond //微秒
    Millisecond = 1000 * Microsecond //毫秒
    Second = 1000 * Millisecond //秒
    Minute = 60 * Second //分钟
    Hour = 60 * Minute //小时
    )

常量的作用:在程序中可用于获取指定时间单位的时间,比如想得到 100 毫秒 100 * time. Millisecond

  1. 结合 Sleep 来使用一下时间常量
    请添加图片描述
  2. time 的 Unix 和 UnixNano 的方法
    请添加图片描述

6.24.2 时间和日期的课堂练习

编写一段代码来统计 函数 test03 执行的时间
请添加图片描述

6.25 内置函数

6.25.1 说明:

Golang 设计者为了编程方便,提供了一些函数,这些函数可以直接使用,我们称为 Go 的内置函 数。文档:https://studygolang.com/pkgdoc -> builtin

  1. len:用来求长度,比如 string、array、slice、map、channel
  2. new:用来分配内存,主要用来分配值类型,比如 int、float32,struct…返回的是指针

举例说明 new 的使用:
请添加图片描述请添加图片描述

  1. make:用来分配内存,主要用来分配引用类型,比如 channel、map、slice。这个我们后面讲解。

6.26 错误处理

6.26.1 看一段代码,引出错误处理

请添加图片描述

  1. 在默认情况下,当发生错误后(panic) ,程序就会退出(崩溃.) 2) 如果我们希望:当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行。还可
    以在捕获到错误后,给管理员一个提示(邮件,短信。。。)
  2. 这里引出我们要将的错误处理机制

6.26.2 基本说明

  1. Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理。 2) Go 中引入的处理方式为:defer, panic, recover 3) 这几个异常的使用场景可以这么简单描述:Go 中可以抛出一个 panic 的异常,然后在 defer 中
    通过 recover捕获这个异常,然后正常处理

6.26.3 使用 defer+recover 来处理错误

package main

import (
	"fmt"
	"time"
)

func test() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("err=",err)
		}
	}()
	num1 := 10
	num2 := 0
	res := num1/num2
	fmt.Println("res=", res)
}

func main() {
	test()
	for {
		fmt.Println("main()")
		time.Sleep(time.Second)
	}
}

6.26.4 错误处理的好处

进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。看一个 案例演示:
请添加图片描述

6.26.5 自定义错误 6.26.6 自定义错误的介绍

Go 程序中,也支持自定义错误, 使用 errors.New 和 panic 内置函数。

  1. errors.New(“错误说明”) , 会返回一个 error 类型的值,表示一个错误
  2. panic 内置函数 ,接收一个 interface{}类型的值(也就是任何值了)作为参数。可以接收 error 类
    型的变量,输出错误信息,并退出程序.

6.26.7 案例说明

package main

import (
	"errors"
	"fmt"
)

func readConf(name string) (err error) {
	if name == "config.ini" {
		return nil
	}else {
		return errors.New("读取文件错误...")
	}
}

func test02(){
	err := readConf("config2.ini")
	if err!=nil{
		panic(err)
	}
	fmt.Println("test02()继续执行...")
}

func main() {
	test02()
	fmt.Println("main()下面的代码...")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP FICO 成本对象控制解析

成本对象控制(Cost Object Cotrol)是指对不同的成本对象,比如成本收集器、生产订单、销售订单等进行成本的期末结算。基于这些不同的成本对象,SAP在成本对象控制菜单下面细分了相应的操作(SAP 菜单 →会计核算 →控制 …

JavaScript篇.day10-面向对象,对象,构造函数,this关键字,原型

目录面向对象对象构造函数this关键字原型面向对象面向过程: 在开发过程中,关注过程的开发方式. 在开发时关注每一个细节,步骤和顺序.面向对象: 在开发过程中,只需要找一个对象来完成事情的开发思想对象: 在生活中,万物皆对象 封装: 将完成步骤封装在对象内部属性: 对象的特征核…

Java泛型上界与泛型方法的应用 | 如何通过泛型类获取任意类型的三个数的最大值?

目录 一、引言 二、泛型上界 1、什么是泛型的上界 2、泛型上界的语法 三、泛型方法 1、泛型方法的语法 2、泛型方法的类型推导 三、编程分析 1、MyCompare泛型类 2、泛型方法实现 四、总结 一、引言 初学Java时,同学们基本都会遇到这样一个基础编程题&am…

平面设计师去哪里找素材?

5个平面设计素材网站,赶紧收藏! 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx ​ 站内平面海报、UI设计、电商淘宝、免抠、高清图片、样机模板等素材非常齐全。还有在线抠图、CDR版本转换功能,能有效的为设计师节省找素材时间&#x…

MySQL查询训练题1

表信息: dept表和emp表 bonus表和salgrade表 练习题: 1、选择部门30中的所有员工; select * from Emp where DEPTNO30;2、列出所有办事员(CLERK)的姓名,编号和部门编号; select ENAME 姓名,EMPNO 编号,DEPTNO 部门…

【vue2中使用axios和插槽】一.组件的生命周期;二.vue2中使用axios;三.插槽

目录 一.组件的生命周期 1.组件的生命周期经历的阶段: (1)创建阶段:beforeCreate、created、beforeMount、mounted (2)运行阶段:beforeUpdate、update (3)销毁阶段&a…

C++ 学习 Day.10(标准模板库简介)

标准模板库: 简单地说,标准模板库(STL)是一组模板类和函数,向程序员提供了: • 用于存储信息的容器; • 用于访问容器存储的信息的迭代器; • 用于操作容器内容的算法。 关于STL可见…

Git学习和使用

目录:Git概念和知识Git的四个工作区域和工作流程Git 的四个工作区域Git 的工作流程git文件状态常用操作进阶操作单个本地库绑定多远程仓库方案Git概念和知识 Git的四个工作区域和工作流程 Git 的四个工作区域 Remote:远程仓库 位于托管代码的服务器&a…

【语义分割】语义分割综述文章

目录:语义分割一、什么是语义分割二、什么是图像中的语义信息?三、语义分割中的上下文信息四、语义分割方法五、语义分割神经网络六、目前比较经典的网络七、评价指标一、什么是语义分割 语义分割,也称为像素级分类问题,其输出和…

如何远程访问别人的MySQL数据库

1、 如何远程访问别人的MySQL数据库 - curryzwy - 博客园 (cnblogs.com)https://www.cnblogs.com/curryzwy/p/15730485.html 2、 mysql——同一局域网如何共同访问一台电脑的数据库(胎教级教学)_七月星辰的博客-CSDN博客_两台电脑共用一个mysql数据库…

1803. 统计异或值在范围内的数对有多少

解法一:字典树 前置知识:字典树 字典树是一种实现字符串快速检索的多叉树结构。 例如:给定字符串集合[cab, cos, car, cat], 我们现在需要判断cat是否存在于字符串集合中。 字典树代码: static int[][] trie new int[N][26]; …

AcWing 1221. 四平方和(二分或哈希)

一、题目描述 二、思路分析 先从时间复杂度的角度入手,这道题的数据范围是106,因此我们的时间复杂度要控制在O(n)O(n)O(n)或者O(nlogn)O(nlogn)O(nlogn)。 对于abcd中的任何一个元素,必定是小于n\sqrt nn​的。 我们的一个思路就是去枚举&…

如何选择用 .net Framework 或 .net core

小米问: 给你一个项目,如何选择用 netframework 或 netcore?如何选择服务器? 怎么去考虑? 咋回答呢 答: 不要考虑.net framework 除非极其特殊的情况 比如目标主机系统版本较低 服务器自然是linux好&a…

2023年考证时间一览表

2022年已经成为历史,在疫情背景全面开放下给大家整理了2023年全年的考试时间以及报名时间新鲜出炉,了解清楚,为2023年提前做好规划! 1月份 2022年下半年中小学教师资格考试面试 报名时间:2022年12月9日-12日 考试时间…

大数据:Hive视图和索引

一、视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0.0 引入的物化视图除外),当查询引用视图时&#xff0…

【自学C++】Windows安装C++语言开发环境

Windows安装C语言开发环境 Windows安装C语言开发环境教程 C 的开发环境可以直接使用 C 语言 的开发环境, 同时,Windows 本身就自带 C 语言的运行环境,因此,为了开发 C 语言,我们只需要安装一个 C 语言的开发工具即可…

第03讲:HTTP操作之ElasticSearch文档操作

3.1.2、文档操作 实验1:创建文档 索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式 在 Postman 中,向 ES 服务器发 POST 请求 :http://1…

【Kafka】Java实现数据的生产和消费

【Kafka】Java实现数据的生产和消费 Kafka介绍 Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。 Kafka 有如下…

【LeetCode】1803. 统计异或值在范围内的数对有多少

1803. 统计异或值在范围内的数对有多少 题目描述 给你一个整数数组 nums &#xff08;下标 从 0 开始 计数&#xff09;以及两个整数&#xff1a;low 和 high &#xff0c;请返回 漂亮数对 的数目。 漂亮数对 是一个形如 (i, j) 的数对&#xff0c;其中 0 < i < j <…

阻塞式队列

文章目录一、阻塞队列阻塞队列的概念阻塞队列相关类和方法生产者消费者模型二、自定义实现阻塞队列自定义实现循环队列自定义实现阻塞队列生产者消费者模型体验一、阻塞队列 阻塞队列的概念 队列我们并不默认&#xff0c;一提起队列&#xff0c;我们立马就能想到 "先进先…