Golang面试题一(基础类)

目录

1.与其他语言相比,使用 Go 有什么优势?

1. 高效的并发模型CSP

2. 简洁的语法与清晰的编程模型

3. 快速编译与高性能执行

4. 内置的垃圾回收机制

5. 丰富的标准库与活跃的社区

6. 跨平台支持与良好可移植性

7. 易于部署与版本管理

8. 强大的错误处理机制

9. 泛型支持(Go 1.18+)

2.什么是CSP理论

3.Golang的数据类型

基本数据类型

整数类型

无符号整数类型

浮点数类型

复数类型

布尔类型

字符串类型

派生数据类型

数组类型

切片类型

结构体类型

指针类型

函数类型

接口类型

地图类型

通道类型

引用类型

指针(Pointers)

切片(Slices)

映射(Maps):

通道(Channels):

接口(Interfaces):

其他相关类型

4.Go 程序中的包是什么

5.Go支持什么形式的类型转换?将整数转换为浮点数 

显式类型转换

隐式类型转换(类型提升)

整数转换为浮点数

6.什么是 Goroutine?你如何停止它?

1.什么是 Goroutine

2.如何停止 Goroutine?

使用 Channel 信号:

使用 Context:

使用WaitGroup

共享状态变量与 Mutex/RWMutex

7、如何在运行时检查变量类型

类型断言

反射包 (reflect)

类型开关 (switch)

8.Go 当中同步锁有什么特点?作用是什么

特点

作用

9.Go 语言当中 Channel(通道)有什么特点,需要注意什么?

特点

10.Go 语言中 cap 函数可以作用于哪些内容?

1. 切片(Slices)

2. 通道(Channels)


1.与其他语言相比,使用 Go 有什么优势?

1. 高效的并发模型CSP

Go 语言内置了对并发编程的强大支持,通过 Goroutines(轻量级线程)和 Channels(用于通信的同步原语)实现了基于 CSP(Communicating Sequential Processes)模型的并发编程。

Go 的 Goroutines 轻量且高效,系统能够轻松创建和调度大量并发任务,而 Channels 提供了安全的同步和数据传递机制,避免了复杂的锁机制和线程管理,有助于构建清晰、解耦的并发程序。

这种模型使得编写高并发、高吞吐的服务器应用程序变得简单且高效。

2. 简洁的语法与清晰的编程模型

Go 语言设计简洁,语法接近自然语言,易于学习和阅读。它摒弃了复杂的类型系统、继承、虚函数等特性,转而采用结构体组合(Composition over Inheritance)、接口(Interfaces)和类型嵌入(Type Embedding)等简单而强大的工具来实现代码复用和抽象。这种设计使得 Go 代码结构清晰,易于理解和维护。此外,Go 的强制性代码风格(通过 gofmt 自动格式化)确保了团队间代码风格的一致性,降低了协作成本。

3. 快速编译与高性能执行

Go 是一种静态类型、编译型语言,编译速度快,生成的二进制文件小巧、无依赖,可以直接部署到目标环境。Go 编译器生成的代码通常具有优秀的运行时性能,接近 C/C++,同时避免了手动内存管理的复杂性。Go 的运行时(runtime)经过精心优化,尤其是在多核处理器上的并发性能表现出色,非常适合现代硬件架构。

4. 内置的垃圾回收机制

Go 语言内置了自动垃圾回收(GC)系统,程序员无需手动管理内存,大大降低了内存泄漏的风险和内存管理的复杂性。Go 的 GC 通过周期性标记-清除或三色标记法进行垃圾回收,虽然可能带来一定的延迟,但随着 Go 语言版本的演进,GC 性能不断提升,对大部分应用来说,其影响已降至可接受范围。

5. 丰富的标准库与活跃的社区

Go 语言拥有一个庞大且全面的标准库,覆盖了网络编程、加密、压缩、文本处理、数据序列化、操作系统交互等多个领域,为开发者提供了开箱即用的功能。此外,Go 社区活跃,有大量的高质量第三方库和框架,如用于 Web 开发的 Gin、Echo,数据库操作库 sqlx、gorm,以及众多工具和库支持微服务、云原生、DevOps 等场景。Go 语言得到了 Google、Cloudflare、Uber、Twitch 等众多知名公司的广泛应用,形成了深厚的生态系统。

6. 跨平台支持与良好可移植性

Go 语言编译的二进制文件无需依赖运行时环境或虚拟机,可以直接运行在多种操作系统(如 Linux、macOS、Windows)和架构(如 amd64、arm64)上。这种跨平台特性使得 Go 语言非常适合开发云原生应用、微服务、CLI 工具等需要在多种环境下部署的软件。

7. 易于部署与版本管理

Go 语言通过 go buildgo install 等工具简化了编译和部署流程,支持交叉编译,方便为不同平台生成对应二进制文件。Go 1.11 及更高版本引入了模块(Module)系统,提供了对依赖项的版本管理和包管理功能,使得大型项目和团队的依赖管理更为便捷和一致。

8. 强大的错误处理机制

Go 语言强制要求程序员显式处理错误,每个可能出错的操作都应返回一个 error 类型的值。这种设计促进了对错误的明确、及时处理,有助于编写健壮、可维护的代码。结合多返回值、panic/recover 机制以及自定义错误类型,Go 提供了一套完整的错误处理体系。

9. 泛型支持(Go 1.18+)

自 Go 1.18 版本起,Go 语言引入了泛型(Generics)特性,允许开发者编写适用于多种类型的通用代码,提高了代码复用性,减少了类型复制和转换的工作,同时保持了语言的简洁性和类型安全性。

综上所述,Go 语言以其高效的并发模型、简洁的语法、出色的性能、内置的垃圾回收、丰富的标准库、活跃的社区、良好的跨平台支持、易于部署的特性以及强大的错误处理机制,为开发者提供了构建高性能、易于维护的服务器端应用、网络服务、工具和微服务的优秀平台。泛型的加入进一步提升了 Go 的编程能力和代码复用水平。

2.什么是CSP理论

CSP 理论最初由计算机科学家 Tony Hoare 在1978年提出,其核心思想是通过独立的并发实体(processes)通过严格的通信机制来协同工作,而不是直接共享内存。

3.Golang的数据类型

基本数据类型

整数类型
  • int: 默认的有符号整数类型,其大小取决于目标平台,一般为 32 或 64 位。
  • int8: 8 位有符号整数,取值范围为 -128 到 127。
  • int16: 16 位有符号整数,取值范围为 -32768 到 32767。
  • int32: 32 位有符号整数,取值范围为 -2147483648 到 2147483647。
  • int64: 64 位有符号整数,取值范围为 -9223372036854775808 到 9223372036854775807。
无符号整数类型
  • uint: 默认的无符号整数类型,大小与 int 相同,取决于平台。
  • uint8: 8 位无符号整数,取值范围为 0 到 255,也称为 byte
  • uint16: 16 位无符号整数,取值范围为 0 到 65535。
  • uint32: 32 位无符号整数,取值范围为 0 到 4294967295。
  • uint64: 64 位无符号整数,取值范围为 0 到 18446744073709551615。
浮点数类型
  • float32: 32 位浮点数,遵循 IEEE 754 标准,精度约为 6-7 位小数。
  • float64: 64 位浮点数,Go 语言中默认的浮点数类型,精度约为 15 位小数。
复数类型
  • complex64: 由两个 float32 组成的复数,表示实部和虚部。
  • complex128: 由两个 float64 组成的复数,表示实部和虚部。
布尔类型
  • bool: 表示逻辑值,仅有两个取值:true 和 false
字符串类型
  • string: 不可变的字符序列,由双引号 " 或反引号 ` 包围,内部使用 UTF-8 编码。

派生数据类型

数组类型
  • []T: 固定长度的同类型元素序列,如 []int 表示整数数组。
切片类型
  • []T: 动态长度的同类型元素序列,与数组类似但更灵活,可以改变长度和容量。
结构体类型
  • struct { Field1 Type1; Field2 Type2; ... }: 由零个或多个字段组成的数据结构,每个字段有自己的名称和类型。
指针类型
  • *T: 指向类型 T 的内存地址,通过 & 运算符获取变量的地址,通过 * 运算符访问指针所指向的值。
函数类型
  • func (arg1 Type1, arg2 Type2, ...) (ret1 Type1, ret2 Type2, ...): 表示具有特定参数列表和返回值列表的函数。
接口类型
  • interface { Method1(args); Method2(args); ... }: 定义一组方法签名,任何实现了这些方法的类型都实现了该接口。
地图类型
  • map[K]V: 关联数组或哈希表,存储键值对,键类型 K,值类型 V
通道类型
  • chan T: 用于 Goroutines 之间通信的通道,可以是带缓冲或无缓冲的,用于发送和接收类型为 T 的值。

引用类型

Go 语言中的引用类型是指那些值为内存地址(指针)的类型。这些类型的变量并不直接存储数据本身,而是存储指向数据的指针。对引用类型的变量进行操作时,实际上是通过指针间接操作其指向的内存区域。Go 语言中的引用类型主要包括以下几种:

指针(Pointers)

  • 指针类型变量直接存储一个内存地址,指向另一个变量。声明时使用 * 符号表示指针类型,如 var p *int 表示 p 是一个指向整数的指针。

切片(Slices)

  • 切片是一个动态大小的、可增长的序列,其值由指向底层数组的指针、长度和容量组成。声明时使用 [] 符号,如 var s []int 表示 s 是一个整数切片。

映射(Maps):

  • 映射是一个键值对的集合,其值由指向散列表的指针和其他内部数据构成。声明时使用 map 关键字,如 var m map[string]int 表示 m 是一个键为字符串、值为整数的映射。

通道(Channels):

  • 通道是 Go 语言中用于并发通信的类型,其值由指向内部数据结构(如环形缓冲区)的指针等组成。声明时使用 chan 关键字,如 var ch chan int 表示 ch 是一个传递整数的通道。

接口(Interfaces):

  • 接口类型变量存储一个指向具体类型值的指针以及该值的实际类型信息。声明时使用 interface 关键字,如 var i interface{} 表示 i 是一个空接口类型变量。

引用类型的主要特点和注意事项包括:

  • 内存共享:引用类型的变量通过指针共享底层数据,对一个变量的操作可能影响到其他变量。例如,多个切片可能共享同一底层数组,修改一个切片的元素会影响其他共享该数组的切片。

  • 资源管理:对于引用类型,尤其是指针、切片和映射,需要关注其生命周期和何时释放资源。例如,使用完映射后应通过 delete 删除键值对或用 nil 赋值清空映射,以避免内存泄漏。

  • 并发安全:在并发环境中,对引用类型的访问和修改通常需要同步原语(如互斥锁 sync.Mutex)来保证线程安全。特别是映射和通道,它们并非线程安全的,直接在多个 Goroutine 中并发读写可能会导致数据竞争或死锁。

  • 性能考量:由于引用类型涉及到间接寻址,访问速度理论上略低于直接存储数据的值类型。但在处理大量数据或需要动态调整数据结构大小时,引用类型(如切片、映射)因其灵活性和高效内存管理而更具优势。

总的来说,Go 语言中的引用类型提供了一种间接访问和操作数据的方式,它们在实现数据共享、内存管理和并发通信等方面扮演着重要角色。正确理解和使用引用类型是编写高效、健壮的 Go 语言程序的关键之一。

其他相关类型

  • rune: 类型别名,等同于 int32,用于表示 Unicode 代码点(字符)。
  • byte: 类型别名,等同于 uint8,通常用于表示字节数据。
  • uintptr: 表示一个无类型指针,主要用于低级别编程或与 C 语言互操作。

这些数据类型构成了 Go 语言的基础,程序员可以根据实际需求选择合适的数据类型来构建程序。通过组合使用这些类型,可以实现复杂的数据结构、算法和系统设计。同时,Go 语言还提供了类型转换、类型断言、类型推断等机制,进一步增强了类型系统的灵活性和实用性。

4.Go 程序中的包是什么

在 Go 程序中,包(package)是组织和管理代码的基本单位。

包在文件顶部使用以下命令声明:

package <packagename>

使用以下方法导入和导出包以重用导出的函数或类型

import <packagename>

Golang 的标准包是fmt,其中包含格式化和打印功能,如Println()

5.Go支持什么形式的类型转换?将整数转换为浮点数 

显式类型转换

使用类型转换操作符 T(x) 将表达式 x 显式转换为类型 T。这是在需要将一个类型的值明确转换为另一种类型时使用的。

示例:将整数转换为浮点数:

var i int = 42
f := float64(i) // 显式将整数 i 转换为浮点数类型 float64

在这个例子中,i 是一个整数变量,通过 float64(i) 将其显式转换为 float64 类型的值,并赋给变量 f

隐式类型转换(类型提升)

在某些情况下,Go 语言会在编译期间自动进行类型转换,无需显式操作。这通常发生在赋值、算术运算、函数调用等场景中,只要目标类型能无损容纳源类型的所有值。例如,较小的整数类型(如 int8int16)赋值给较大的整数类型(如 intint64),或较小的浮点数类型(如 float32)赋值给较大的浮点数类型(如 float64)。

但是,需要注意的是,Go 语言并不支持隐式地将整数类型转换为浮点数类型,也不支持将浮点数类型转换为整数类型。对于这类转换,必须使用显式类型转换。

整数转换为浮点数

综上所述,要将整数转换为浮点数,需要使用显式类型转换,即使用 float64(或 float32)作为转换类型的操作符,将整数表达式放在括号内进行转换。例如:

var i int = 123
var f float64 = float64(i) // 将整数 i 转换为浮点数 f

这样,整数 i 的值就被转换为浮点数 f,并存储在 f 变量中。这个过程在编译时是安全的,因为任何整数都可以无损地转换为浮点数表示。不过,要注意浮点数可能会有精度损失,尤其是在处理非常大或非常小的整数时。在实际编程中,应根据具体需求和精度要求谨慎使用类型转换。

6.什么是 Goroutine?你如何停止它?

1.什么是 Goroutine

Goroutine 是 Go 语言中实现并发编程的核心概念。它是一种轻量级的线程(或称协程),由 Go 运行时(runtime)管理,而非操作系统直接调度。相比于传统的操作系统的线程,它是一种用户态线程,具有更低的创建和上下文切换开销,使得编写高并发、高性能的应用程序变得更加容易和高效。

2.如何停止 Goroutine?

在 Go 语言中,没有直接的机制来强制停止一个正在运行的 Goroutine。然而,可以通过以下几种方式来实现对 Goroutine 的控制,使其在适当的时候自行退出。

使用 Channel 信号

  1. 创建一个带信号值(如布尔值)的 Channel,作为 Goroutine 终止的信号通道。
  2. Goroutine 在循环中监听(select 语句)该 Channel,当接收到终止信号时,退出循环或执行清理逻辑,进而结束自身。
  3. 主程序或其他控制逻辑通过向该 Channel 发送信号来触发 Goroutine 的停止。
package main

func main() {
	stopChan := make(chan bool)

	go func() {
		for {
			select {
			case <-stopChan:
				// 收到停止信号,退出循环
				return
			default:
				// 正常工作逻辑...
			}
		}
	}()

	// 当需要停止 Goroutine 时
	stopChan <- true
}

使用 Context

  1. 使用 context 包提供的 Context 类型作为 Goroutine 的生命周期上下文。
  2. 将 Context 作为参数传递给 Goroutine,并在其内部定期检查 Context.Done() 或通过 select 语句监听 Context 的关闭信号。
  3. 主程序或其他控制逻辑通过调用 Context.CancelFunc() 来触发上下文取消,进而通知 Goroutine 结束执行。
package main

import (
	"context"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())

	go func(ctx context.Context) {
		for {
			select {
			case <-ctx.Done():
				// 收到上下文取消信号,退出循环
				return
			default:
				// 正常工作逻辑...
			}
		}
	}(ctx)

	// 当需要停止 Goroutine 时
	cancel()
}

使用WaitGroup

  1. 使用 sync.WaitGroup 来同步 Goroutine 的结束。当需要停止一组 Goroutine 时,递减 WaitGroup 的计数器而不是直接发送信号。
  2. Goroutine 在完成工作后调用 wg.Done(),而主程序使用 wg.Wait() 来阻塞直到所有 Goroutine 完成。
package main

import "sync"

func main() {
	var wg sync.WaitGroup

	wg.Add(1)
	go func() {
		defer wg.Done()
		// Goroutine 工作逻辑...
	}()

	// 当需要停止 Goroutine(组)时
	// 不直接停止,而是等待其自然完成
	wg.Wait()
}

共享状态变量与 Mutex/RWMutex

  1. 通过共享一个标志变量(如布尔值)和互斥锁(sync.Mutex 或 sync.RWMutex)来协调 Goroutine 的退出。
  2. Goroutine 定期检查该标志变量(在锁保护下),当发现标志指示退出时,结束执行。
package main

import "sync"

var (
	stopFlag bool
	mu       sync.Mutex
)

func main() {
	go func() {
		for {
			mu.Lock()
			if stopFlag {
				mu.Unlock()
				return
			}
			mu.Unlock()

			// 正常工作逻辑...
		}
	}()

	// 当需要停止 Goroutine 时
	mu.Lock()
	stopFlag = true
	mu.Unlock()
}

总结来说,尽管 Go 语言本身不提供直接停止 Goroutine 的机制,但通过巧妙地利用 Channel、Context、WaitGroup 或共享状态变量,可以有效地控制 Goroutine 的生命周期,实现优雅的停止或适时的退出。选择哪种方式取决于具体的编程场景和需求。在实践中,Channel 和 Context 方法因其良好的抽象性和易用性而更为常用。

7、如何在运行时检查变量类型

类型断言

value := someInterfaceValue
if concreteValue, ok := value.(ConcreteType); ok {
    // value 实际上是 ConcreteType 类型,现在可以使用 concreteValue
} else {
    // value 不是 ConcreteType 类型
}

反射包 (reflect)

import "reflect"

var myVar = 42

typ := reflect.TypeOf(myVar) // 获取类型信息
val := reflect.ValueOf(myVar) // 获取值的反射对象

// 检查基本类型
if typ.Kind() == reflect.Int {
    fmt.Println("myVar is an int")
}

// 检查类型名
if typ.String() == "int" {
    fmt.Println("myVar is of type 'int'")
}

类型开关 (switch)

var someValue interface{} = ... // 可能是多种类型之一

switch actualValue := someValue.(type) {
case int:
    fmt.Printf("someValue is an int with value %d\n", actualValue)
case string:
    fmt.Printf("someValue is a string with value %s\n", actualValue)
case MyCustomType:
    fmt.Printf("someValue is a MyCustomType with field X: %d\n", actualValue.X)
default:
    fmt.Println("someValue has an unknown type")
}

8.Go 当中同步锁有什么特点?作用是什么

Go 语言中的同步锁主要用于保护共享资源的并发访问,确保在某一时刻只有一个 Goroutine 能够访问这些资源,从而避免数据竞争和不一致状态。

特点

  1. 互斥性(Mutual Exclusion):同步锁一次只能被一个 Goroutine 持有,其他试图获取锁的 Goroutine 必须等待锁被释放后才能获得锁并进入临界区(即访问受保护的共享资源的代码块)。

  2. 阻塞性(Blocking):当一个 Goroutine 尝试获取已被其他 Goroutine 持有的锁时,它会被阻塞(挂起),直到锁被释放。阻塞的 Goroutine 在锁释放后会被重新调度执行。

  3. 非公平性(Non-Fairness):Go 语言标准库提供的 sync.Mutex 和 sync.RWMutex 等同步锁默认是非公平的,即它们不保证等待时间最长的 Goroutine 一定能优先获得锁。锁的分配取决于运行时调度器的决策,可能会出现“插队”现象。

  4. 资源开销低:相较于操作系统的原生线程锁,Go 语言中的同步锁由于运行在用户态且由 Go 运行时管理,其创建、获取和释放的开销相对较低,适合大规模并发场景。

  5. 不是可重入的锁,一旦误用 Mutex 的重入,会导致死锁。

作用

  1. 数据竞争避免:同步锁是最基础的并发控制工具,用于防止多个 Goroutine 同时访问同一份数据导致的数据竞争。通过在访问共享资源的代码块前获取锁,确保同一时刻只有一个 Goroutine 修改或读取数据,维持数据的一致性。

  2. 状态一致性维护:在涉及复杂状态管理或状态机的场景中,同步锁用于确保状态变更操作的原子性,防止因并发操作而导致的状态混乱。

  3. 资源同步访问:对于有限的公共资源(如连接池、信号量、互斥资源等),同步锁可以协调多个 Goroutine 的访问顺序,避免资源被过度使用或冲突。

  4. 并发控制:通过对关键代码段加锁,可以控制多个 Goroutine 的执行顺序,确保按照预期的并发逻辑执行。

  5. 结构体或对象封装:在结构体或对象内部使用同步锁,可以隐藏并发细节,提供线程安全的接口给外部使用,提升代码的模块化程度和可重用性。

综上所述,Go 语言中的同步锁通过提供互斥访问机制,确保在并发环境下对共享资源的访问是有序且无冲突的,对于编写正确的并发程序至关重要。在实际编程中,应合理使用同步锁,并遵循最小化锁定范围的原则,以减少锁竞争和提高并发性能。同时,根据具体需求,还可以考虑使用读写锁(sync.RWMutex)、条件变量(sync.Cond)等更细粒度的同步原语。

9.Go 语言当中 Channel(通道)有什么特点,需要注意什么?

Go 语言中的 Channel(通道)是一种内置的通信机制,用于在 Goroutines(轻量级线程)之间安全地传递数据。

特点

  1. 类型化:Channel 是类型化的,即每个 Channel 只能传递特定类型的数据。声明 Channel 时需指定数据类型,如 ch := make(chan int) 创建了一个只能传递整数的 Channel。

  2. 双向通信:Channel 可以是双向的(chan T)或单向的(<-chan T 用于接收数据,chan<- T 用于发送数据)。双向 Channel 可以同时用于发送和接收数据,单向 Channel 则限制了数据流动方向,提供了更强的类型约束和代码意图表达。

  3. 缓冲与非缓冲:Channel 可以是缓冲的(make(chan T, capacity))或非缓冲的(make(chan T))。非缓冲 Channel(无缓冲)在发送数据时必须有 Goroutine 正在等待接收,否则发送操作会阻塞,直到有接收者准备就绪。相反,缓冲 Channel 具有一定容量,可以暂时存放一定数量的数据,允许发送者在无接收者时将数据放入 Channel,直到 Channel 满载。

  4. 同步与通信:Channel 是 Go 语言实现 CSP(Communicating Sequential Processes)模型的关键组件。通过 Channel,Goroutines 之间的通信同时也是同步机制,发送和接收操作都会在必要时阻塞,直到对方准备好。这种设计避免了直接共享内存带来的竞态条件和同步问题。

  5. 关闭(Close):Channel 可以通过 close(ch) 函数关闭。关闭后的 Channel 不能再发送数据,但可以继续接收直至 Channel 中的数据被完全接收完毕。接收操作从关闭的 Channel 接收数据时,会返回该数据以及第二个值 ok 为 false,表示 Channel 已关闭且无更多数据。

  6. 选择器(Select)select 语句用于监听多个 Channel 的操作。当有多个 Channel 同时处于可操作状态时,select 会随机选择一个执行。select 可以配合 default 子句处理无 Channel 可操作的情况,或者设置超时(time.After)。

10.Go 语言中 cap 函数可以作用于哪些内容?

1. 切片(Slices)

cap 函数最常用于获取切片([]T)的容量(Capacity)。切片由三个部分组成:指向底层数组的指针、长度(Length)和容量(Capacity)。长度表示切片中有效元素的数量,而容量则是切片底层数组能够容纳的最大元素数量。使用 cap 函数可以获取切片当前能够容纳多少个元素,而不考虑当前已有的元素个数:

s := make([]int, 5, 10) // 创建一个长度为 5、容量为 10 的切片
fmt.Println(cap(s)) // 输出:10

2. 通道(Channels)

cap 函数也可以用于获取通道(chan T)的容量。对于有缓冲的通道,容量表示通道内部缓冲区能够存储的最大元素数量。无缓冲的通道(也称为同步通道)的容量为 0。通过 cap 函数,可以了解通道能够暂存多少个元素,以便更好地管理并发通信:

ch := make(chan int, 3) // 创建一个容量为 3 的有缓冲通道
fmt.Println(cap(ch)) // 输出:3

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频拍摄知识+AIGC数据预处理

视角 参考链接&#xff1a;https://www.polarpro.com/blogs/polarpro/filmmaking-101-types-of-camera-shots-and-angles Low Angle Shot 低角度拍摄、horizontal Shot 平视、Dutch Angle Shot 荷兰角斜拍、High Angle Shot 高角度拍摄、Bird’s-eye / Aerial Shot 鸟瞰 / 航…

【Mysql数据库进阶01】窗口函数

窗口函数 1 定义2 聚合窗口函数2.1 默认效果/累计效果2.2 前面两行当前一行2.3 前面一行当前一行后面一行 3 排名窗口函数3.1 排名函数3.1.1 排名函数案例 3.2 累积分布 4 取值窗口函数 1 定义 完整的窗口函数定义如下: window_function([expression]) over(partition byorde…

计算机网络 -- 网络编程基础

一 学习准备 1.1 IP地址 在 前文中我们提到过: IP 是全球网络的基础&#xff0c;使用 IP 地址来标识公网环境下主机的唯一性&#xff0c;我们可以根据 目的IP地址 进行跨路由器的远端通信。 但是我们也提到了&#xff0c;通过 IP 地址&#xff0c;只能寻找到目标主机&#xff…

Transformer - Teacher Forcing

Transformer - Teacher Forcing flyfish 在训练过程中&#xff0c;将目标序列输入给解码器的方法称为&#xff08;Teacher Forcing&#xff09;。这个术语又代表什么意思呢&#xff1f; 这里的目标序列就是Ground Truth&#xff0c;也就是我们已知的正确答案 一句话就是我们…

系统思考—战略

“有策略而无战术&#xff0c;是取胜之最慢之道。有战术而无策略&#xff0c;是败亡之前的嘈杂。”—孙子 最近接触的中小企业&#xff0c;充分能感受到在经济下行的情况下&#xff0c;组织与战略是不可分割的两个方面。有时候公司组织出现了问题&#xff0c;可能是因为战略不…

高效便捷!解锁阿里云跨账号专线互联的全新实施方案

作者&#xff1a;小丫、琉璃 背景 为持续提升金融云环境的合规标准以及可用区内产品服务的性能和稳定性&#xff0c;阿里云将对杭州地域BCD三个金融云可用区进行基础设施架构升级与改造&#xff0c;对应可用区云产品将于 2024 年后停止服务&#xff0c;需要将业务迁移到新可用…

HarmonyOS实战开发-如何实现一个简单的健康生活应用

功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、73天、99天时&#xff0c;可以获得…

42-软件部署实战(下):IAM系统安全加固、水平扩缩容实战

IAM应用安全性加固 iam-apiserver、iam-authz-server、MariaDB、Redis和MongoDB这些服务&#xff0c;都提供了绑定监听网卡的功能。将服务绑定到内网网卡上。 我们也可以通过iptables来实现类似的功能&#xff0c;通过将安全问题统一收敛到iptables规则&#xff0c;可以使我…

利用FFmpeg 转换课程vtt 字幕到 srt字幕

字幕转换工具 经常学习udemy 视频课程的&#xff0c;可能知道&#xff0c;从网络下载的udemy 课程文件里面有时候字幕是vtt 格式的&#xff0c;有时候想导入到百度网盘里面&#xff0c;怎奈百度网盘&#xff0c;不支持vtt 字幕格式。有字幕的时候&#xff0c;会比较好多了。既可…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数&#xff0c;来说说该函数的主要功能是什么&#xff0c;简单来说&#xff0c;super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xf…

第十五届蓝桥杯复盘python大学A组——试题C 数字诗意

思路 数字可以分为 有诗意的数字可以写成 (ij)(j-i1)/2 &#xff08; i、j都是正整数 &#xff09; ij 、j-i1 的奇偶性不同&#xff08;因为i、j都是正整数&#xff09; 因此&#xff0c; 如果一个数是奇数就一定有诗意 eg.312 ,523,734,945… 原因&#xff1a;根据上述分…

什么是yum、以及yum源

文章目录 yum介绍软件安装/卸载生态 yum Linux中需要对对工具、指令、程序进行安装、检查、卸载等工作&#xff0c;需要使用到yum。 Linux中安装软件的方式 源代码安装rpm包直接安装yum安装 / apt-get安装 介绍 yum是Linux预装的一个指令&#xff0c;搜索、下载、安装对应…

2.6 类型安全配置属性

无论是Propertes配置还是YAML配置&#xff0c;最终都会被加载到Spring Environment中。 Spring提供了注解Value以及EnvironmentAware接口来将Spring Environment 中的数据注入到属性上&#xff0c;SpringBoot对此进一步提出了类型安全配置属性(Type-safeConfiguration Propert…

从计算机视觉到生命科学

人工智能技术的快速发展正在深刻影响和重塑我们的生活。作为AI领域的前沿方向,多模态大模型凭借其强大的跨域学习和推理能力,在众多行业和科学领域展现出广阔的应用前景。多模态AI指的是能够同时处理和整合文本、图像、音频、视频等不同模态数据的智能系统。这种融合不同信息源…

uni-admin中引入uni-cms的缺少schema及uni-media-library缺少云函数的问题

1. 在管理端运行提示一些表找不到&#xff0c;因为是uni-admin关联的uni-starter的服务空间&#xff0c;在uni-admin的uniCloud中没有内容&#xff0c;在uni-starter的uniCloud中也没有发现对应的表&#xff0c;后面干脆在云端找到对应的表之后新建了&#xff0c;然后再下载到本…

网工内推 | 14薪!安全服务工程师,上市公司,CISP认证优先

01 远江盛邦 招聘岗位&#xff1a;安全服务工程师 职责描述&#xff1a; 1、负责对客户网络、系统进行渗透测试&#xff0c;漏洞验证、安全评估和安全加固&#xff1b; 2、负责对监督单位的系统安全问题进行监督&#xff0c;并督察改进&#xff1b; 3、对监管单位的安全告警、…

机器人流量激增:恶意机器人活动升级与新型规避技术挑战企业安全防御

近日&#xff0c;根据Cyber News引用Thales Imperva Bad Bot发布的最新研究报告&#xff0c;揭示了一个令人警醒的现象&#xff1a;2023年&#xff0c;互联网总流量中的49.6%由机器人贡献&#xff0c;相较于上一年增长了2%&#xff0c;创下了自2013年监测以来的历史新高。这一显…

【性能测试】接口测试各知识第4篇:Jmeter 八大元件及执行顺序,学习目标【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

我的2024年暑期三下乡实践宣传投稿之旅

身为2024年暑期大学生三下乡社会实践活动的一员,我肩负着学院赋予的对外信息宣传投稿考核任务。在这条特殊的宣传之路上,我经历了从之初摸着石头过河,一家家联系媒体的艰辛,到后来使用智慧软文发布系统网站进行投稿发文章的轻松转变。 刚开始,我对媒体投稿几乎一无所知。为了完…

力扣136. 只出现一次的数字

Problem: 136. 只出现一次的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 由于题目要求使用线性时间复杂度和常量级的空间复杂度&#xff0c;再加上找重复元素这个特性&#xff0c;我们可以想到使用位运算来求解&#xff1a; 1.任何数与其本身异或得0&#xff0c;任何…
最新文章