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

【面试系列】Go 语言高频面试题

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:

⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。

文章目录

    • Go 初级面试题及详细解答
      • 1. 什么是 Go 语言?它的特点是什么?
      • 2. Go 的主要用途是什么?
      • 3. 如何声明和初始化变量?
      • 4. Go 中的函数是如何定义的?有什么特点?
      • 5. 什么是 Goroutine?
      • 6. 如何进行错误处理?
      • 7. 如何进行并发控制?
      • 8. Go 中如何处理指针?
      • 9. 如何进行单元测试?
      • 10. Go 中如何进行包管理?
    • Go 中级面试题及详细解答
      • 1. Goroutine 的调度和管理是如何工作的?
      • 2. 什么是通道(Channel)?它的主要作用是什么?
      • 3. 如何处理并发安全(Concurrency Safety)?
      • 4. 如何优雅地关闭通道?
      • 5. Go 中的接口(Interface)是如何实现的?有什么特点?
      • 6. Go 中的 defer 语句是什么?它的主要用途是什么?
      • 7. Go 中如何处理错误?
      • 8. 如何进行单元测试和基准测试?
      • 9. Go 中如何进行内存管理?
      • 10. 如何实现并发安全的数据结构?
    • Go 高级面试题及详细解答
      • 1. 什么是 Go 的接口多态性?如何在实际项目中使用?
      • 2. 如何实现并发安全的单例模式?
      • 3. 什么是空结构体(Empty Struct)?它有什么实际用途?
      • 4. 如何实现一个高性能的并发计数器?
      • 5. Go 中的 Context 是什么?如何在 Go 程序中使用 Context?
      • 6. 如何在 Go 中处理大量数据的并发读写?
      • 7. 如何优化 Go 程序的性能?
      • 8. 如何实现自定义的错误类型?
      • 9. 如何实现 Go 中的内存池?
      • 10. 如何在 Go 程序中进行并发安全的日志记录?
      • 使用互斥锁(Mutex)
      • 使用通道(Channel)
      • 使用第三方库
    • 总结
      • 1. 基础语法和数据类型
      • 2. 并发和并行
      • 3. 数据结构和内存管理
      • 4. 错误处理和日志记录
      • 5. 包管理和依赖
      • 6. 测试和性能优化
      • 7. 高级特性和设计模式
      • 8. Web 开发和框架
      • 9. 平台和工具
      • 10. 最佳实践和代码规范

Go 初级面试题及详细解答

1. 什么是 Go 语言?它的特点是什么?

解答
Go(又称 Golang)是一门开源编程语言,由Google开发,并于2009年首次公开发布。它具有内存安全、并发支持、垃圾回收等特性,旨在提高程序员的生产力。

2. Go 的主要用途是什么?

解答
Go 主要用于构建高效、可靠的系统级软件,包括网络服务器、分布式系统、云平台服务等。它也适合开发命令行工具、Web 应用程序和数据处理工具。

3. 如何声明和初始化变量?

解答
在 Go 中,可以使用 var 关键字声明变量,也可以使用短变量声明语法 := 进行变量声明和初始化。

示例:

var name string
var age int
name = "Alice"
age = 30// 或者使用短变量声明
city := "New York"
population := 8000000

4. Go 中的函数是如何定义的?有什么特点?

解答
函数使用 func 关键字定义。Go 函数可以有多个返回值,并支持匿名函数和闭包。函数可以作为一等公民,可以赋值给变量,作为参数传递给其他函数。

示例:

func add(a, b int) int {return a + b
}// 多返回值的函数
func divide(dividend, divisor int) (int, error) {if divisor == 0 {return 0, errors.New("division by zero")}return dividend / divisor, nil
}

5. 什么是 Goroutine?

解答
Goroutine 是 Go 中轻量级的并发执行单元。它由 Go 运行时管理,可以高效地启动成千上万个 Goroutine,每个 Goroutine 都是由 Go 的调度器进行调度和管理的。

示例:

func main() {go doSomething()  // 启动一个 Goroutine 执行 doSomething 函数// 主程序继续执行其他操作
}func doSomething() {// 执行一些任务
}

6. 如何进行错误处理?

解答
Go 推崇使用返回错误值来进行错误处理。通常情况下,函数会返回一个额外的 error 类型作为其最后一个返回值,表示函数执行的成功或失败。

示例:

func readFile(filename string) ([]byte, error) {data, err := ioutil.ReadFile(filename)if err != nil {return nil, err}return data, nil
}

7. 如何进行并发控制?

解答
Go 提供了 sync 包中的原语(如 MutexRWMutex)来进行并发控制,也支持 channel 用于 Goroutine 之间的通信和同步。

示例:

var counter int
var mutex sync.Mutexfunc increment() {mutex.Lock()counter++mutex.Unlock()
}// 使用 channel 进行通信和同步
func main() {ch := make(chan int)go func() {ch <- 42}()value := <-chfmt.Println(value)  // 输出 42
}

8. Go 中如何处理指针?

解答
Go 支持指针,并提供了丰富的指针操作。但相比 C/C++,Go 中的指针更安全,因为不能进行指针运算和类型转换。使用 & 操作符获取变量的地址,使用 * 操作符获取指针指向的值。

示例:

func main() {var x int = 10var ptr *int = &xfmt.Println(*ptr)  // 输出 10
}

9. 如何进行单元测试?

解答
Go 通过 testing 包支持单元测试。编写测试函数时,函数名称必须以 Test 开头,接受一个 *testing.T 参数,使用 t.Errort.Errorf 方法来报告测试失败。

示例:

func Add(a, b int) int {return a + b
}func TestAdd(t *testing.T) {result := Add(2, 3)expected := 5if result != expected {t.Errorf("Add(2, 3) returned %d, expected %d", result, expected)}
}

10. Go 中如何进行包管理?

解答
Go 使用 go mod 进行包管理。可以使用 go mod init 初始化模块,使用 go get 下载依赖包,使用 go buildgo run 构建和运行程序。依赖包信息会记录在 go.modgo.sum 文件中。

示例:

# 初始化模块
go mod init example.com/myproject# 下载依赖包
go get -u github.com/gorilla/mux# 构建和运行程序
go build
./myproject

Go 中级面试题及详细解答

1. Goroutine 的调度和管理是如何工作的?

解答
Goroutine 是 Go 中的轻量级线程,由 Go 运行时(runtime)进行调度和管理。Go 的调度器会将 Goroutine 映射到操作系统的线程上,并在运行时动态调整,确保 Goroutine 的高效执行和资源利用。调度器使用了类似抢占式的调度策略,通过协作式的方式实现 Goroutine 之间的切换,从而避免了传统操作系统线程上下文切换的开销。

2. 什么是通道(Channel)?它的主要作用是什么?

解答
通道是用来在 Goroutine 之间传递数据和同步执行的工具。通道提供了一种类型安全的数据传输机制,通过发送和接收操作来进行通信。通道的主要作用包括解耦发送者和接收者、实现同步和并发控制、以及保证数据的安全传输。通道的零值是 nil,使用 make 函数创建通道。

3. 如何处理并发安全(Concurrency Safety)?

解答
在 Go 中,可以使用 sync 包提供的互斥锁(Mutex)和读写互斥锁(RWMutex)来实现并发安全。互斥锁用于保护共享资源的读写操作,防止多个 Goroutine 同时访问导致的数据竞争问题。此外,还可以使用通道(Channel)来控制并发访问和数据同步。

4. 如何优雅地关闭通道?

解答
通常情况下,通道的接收方会通过 close 函数关闭通道,用于告知发送方数据已经全部发送完毕。在接收方使用 range 迭代通道时,可以通过检查第二个返回值来判断通道是否已关闭。发送方在向已关闭的通道发送数据时会导致 panic,因此通常不建议关闭由发送方操作的通道。

示例:

func main() {ch := make(chan int)go func() {defer close(ch)for i := 1; i <= 5; i++ {ch <- i}}()for num := range ch {fmt.Println(num)}
}

5. Go 中的接口(Interface)是如何实现的?有什么特点?

解答
接口是一种抽象类型,定义了对象的行为。在 Go 中,接口由一组方法签名定义。一个类型只要实现了接口定义的所有方法,即被视为实现了该接口。与其他语言不同的是,Go 的接口实现是隐式的,类型只要实现了接口方法,无需显式声明。这种设计使得 Go 的接口实现更灵活和容易扩展。

示例:

type Shape interface {Area() float64
}type Circle struct {Radius float64
}func (c Circle) Area() float64 {return math.Pi * c.Radius * c.Radius
}func main() {var s Shapes = Circle{Radius: 5}fmt.Println("Area of circle:", s.Area())  // 输出 Area of circle: 78.53981633974483
}

6. Go 中的 defer 语句是什么?它的主要用途是什么?

解答
defer 语句用于延迟函数的执行,即使函数出现错误或者提前返回,defer 语句也能保证其延迟执行。defer 通常用于释放资源、关闭文件、解锁资源等清理操作,以确保在函数执行完毕时执行这些操作,保持代码的清晰和简洁。

示例:

func main() {file := openFile("example.txt")defer closeFile(file)// 使用 file 进行读写操作
}func openFile(filename string) *os.File {fmt.Println("Opening file:", filename)file, err := os.Open(filename)if err != nil {panic(err)}return file
}func closeFile(file *os.File) {fmt.Println("Closing file")err := file.Close()if err != nil {fmt.Println("Error closing file:", err)}
}

7. Go 中如何处理错误?

解答
Go 推崇使用返回错误值来处理函数执行过程中可能发生的错误。函数通常会返回一个额外的 error 类型作为其最后一个返回值,用于指示函数执行的成功或失败。调用方可以通过检查返回的错误值来判断函数是否执行成功,并进行相应的错误处理或者返回。

示例:

func fetchData(url string) ([]byte, error) {resp, err := http.Get(url)if err != nil {return nil, err}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, err}return body, nil
}

8. 如何进行单元测试和基准测试?

解答
Go 使用 testing 包来进行单元测试和基准测试。单元测试函数的名称必须以 Test 开头,并接受一个 *testing.T 参数。基准测试函数的名称必须以 Benchmark 开头,并接受一个 *testing.B 参数。使用 go test 命令运行测试,并使用 -bench 选项运行基准测试。

示例:

func Add(a, b int) int {return a + b
}func TestAdd(t *testing.T) {result := Add(2, 3)expected := 5if result != expected {t.Errorf("Add(2, 3) returned %d, expected %d", result, expected)}
}func BenchmarkAdd(b *testing.B) {for i := 0; i < b.N; i++ {Add(2, 3)}
}

9. Go 中如何进行内存管理?

解答
Go 使用垃圾回收器(Garbage Collector,GC)来自动管理内存。垃圾回收器会定期扫描程序运行时分配的内存,并清理不再使用的内存对象,以避免内存泄漏和提高程序的运行效率。开发者通常无需手动管理内存分配和释放,可以专注于编写业务逻辑。

10. 如何实现并发安全的数据结构?

解答
实现并发安全的数据结构通常需要使用互斥锁或者通道来保护共享数据的读写操作。可以使用 sync.Mutex 或者 sync.RWMutex 来实现对共享数据的并发访问控制。另外,也可以利用通道来进行数据的同步和协调,确保多个 Goroutine 对数据的安全访问。

Go 高级面试题及详细解答

1. 什么是 Go 的接口多态性?如何在实际项目中使用?

解答
Go 中的接口多态性指的是,一个接口变量可以持有任意实现了接口方法的具体类型的值。这种特性允许编写通用的代码,通过接口的方法定义来调用不同类型的具体实现,从而实现代码的高度灵活性和可复用性。

在实际项目中,可以定义一个接口来描述某一类对象的行为,然后针对不同的具体类型实现该接口的方法。通过接口变量,可以将不同的实现细节隐藏在接口背后,从而使得代码更易于扩展和维护。

示例:

type Animal interface {Sound() string
}type Dog struct {}func (d Dog) Sound() string {return "Woof"
}type Cat struct {}func (c Cat) Sound() string {return "Meow"
}func main() {var animal Animalanimal = Dog{}fmt.Println(animal.Sound())  // 输出 Woofanimal = Cat{}fmt.Println(animal.Sound())  // 输出 Meow
}

2. 如何实现并发安全的单例模式?

解答
在 Go 中,可以使用 sync.Oncesync.Mutex 来实现并发安全的单例模式。sync.Once 可以确保某个函数只被执行一次,适合用来初始化单例实例。sync.Mutex 则用于在并发访问时保护单例实例的创建和访问。

示例:

type Singleton struct {data string
}var instance *Singleton
var once sync.Oncefunc GetInstance() *Singleton {once.Do(func() {instance = &Singleton{data: "initialized"}})return instance
}

3. 什么是空结构体(Empty Struct)?它有什么实际用途?

解答
空结构体是指不包含任何字段的结构体,可以用 struct{} 表示。在 Go 中,空结构体不占用内存空间,因此可以用作占位符或信号量。它通常用于实现信号通知、实现集合类型(如 set)、以及作为通道的元素类型,用于仅关注通信事件发生而无需传输额外数据的场景。

示例:

var signal struct{}  // 空结构体作为信号量func main() {ch := make(chan struct{})go func() {// 执行一些任务ch <- struct{}{}  // 发送信号通知任务完成}()<-ch  // 等待任务完成fmt.Println("Task completed")
}

4. 如何实现一个高性能的并发计数器?

解答
在 Go 中,可以使用原子操作或者互斥锁来实现高性能的并发计数器。原子操作适用于简单的计数场景,如 sync/atomic 包中的 AddInt64 函数。互斥锁适用于复杂的计数逻辑或者需要在计数过程中进行其他操作的场景。

示例:

import ("sync""sync/atomic"
)type Counter struct {mu    sync.Mutexcount int64
}func (c *Counter) Increment() {c.mu.Lock()defer c.mu.Unlock()c.count++
}func (c *Counter) GetCount() int64 {return atomic.LoadInt64(&c.count)
}

5. Go 中的 Context 是什么?如何在 Go 程序中使用 Context?

解答
Context 是 Go 标准库中用于在 Goroutine 之间传递取消信号、超时信号和请求范围值的机制。它提供了跟踪和控制 Goroutine 生命周期的手段,用于避免资源泄漏和提高系统的可观察性。

使用 Context 可以在 Goroutine 之间传递值,调用 WithCancel、WithDeadline、WithTimeout 或者 WithValue 方法来创建不同类型的 Context。

示例:

func main() {ctx, cancel := context.WithCancel(context.Background())defer cancel()go doSomething(ctx)
}func doSomething(ctx context.Context) {select {case <-ctx.Done():fmt.Println("Canceled or timed out")returndefault:// 执行任务}
}

6. 如何在 Go 中处理大量数据的并发读写?

解答
在 Go 中,可以使用 sync.RWMutex 实现读写锁来处理大量数据的并发读写。RWMutex 允许多个 Goroutine 同时读取数据,但在写操作时会阻塞所有其他读写操作,以确保数据的一致性和并发安全。

示例:

type Data struct {mu sync.RWMutexdata map[string]string
}func (d *Data) Read(key string) (string, bool) {d.mu.RLock()defer d.mu.RUnlock()value, ok := d.data[key]return value, ok
}func (d *Data) Write(key, value string) {d.mu.Lock()defer d.mu.Unlock()d.data[key] = value
}

7. 如何优化 Go 程序的性能?

解答
优化 Go 程序的性能可以从多个方面入手,包括减少内存分配、避免过度使用 defer、使用并发安全的数据结构、使用原子操作、并发控制优化等。此外,可以使用 Go 的工具和性能分析器(如 pprof)来识别性能瓶颈,并进行针对性的优化。

8. 如何实现自定义的错误类型?

解答
在 Go 中,可以通过实现 error 接口的自定义类型来创建自定义的错误类型。自定义错误类型通常会包含额外的信息,以帮助调用者更好地理解错误的来源和原因。

示例:

type MyError struct {Code    intMessage string
}func (e *MyError) Error() string {return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}func doSomething() error {return &MyError{Code: 500, Message: "Something went wrong"}
}

9. 如何实现 Go 中的内存池?

解答
在 Go 中实现内存池可以通过 sync.Pool 来管理和复用临时对象。sync.Pool 是一个用于存储临时对象的缓存池,可以减少内存分配和垃圾回收的开销,提高程序的性能。

示例:

var pool = sync.Pool{New: func() interface{} {return make([]byte, 1024)},
}func GetBuffer() []byte {return pool.Get().([]byte)
}func ReleaseBuffer(buf []byte) {pool.Put(buf)
}

10. 如何在 Go 程序中进行并发安全的日志记录?

解答
在 Go 程序中进行并发安全的日志记录通常涉及到多个 Goroutine 同时写入日志文件或者其他输出位置时的线程安全性问题。下面我将介绍几种常见的实现方式:

使用互斥锁(Mutex)

使用互斥锁可以确保在任何时候只有一个 Goroutine 能够访问共享资源,从而避免多个 Goroutine 同时写入日志时可能导致的竞争条件。

示例代码:

package mainimport ("fmt""sync"
)type Logger struct {mu sync.Mutex
}func (l *Logger) Log(message string) {l.mu.Lock()defer l.mu.Unlock()fmt.Println(message)
}func main() {logger := Logger{}// 并发写入日志for i := 0; i < 10; i++ {go func(i int) {logger.Log(fmt.Sprintf("Log entry %d", i))}(i)}// 等待所有 Goroutine 结束fmt.Scanln()
}

在上面的示例中,Logger 结构体包含一个互斥锁 mu,在 Log 方法中使用 LockUnlock 方法来保护对共享资源(这里是标准输出)的访问。这样可以确保每次日志记录操作都是原子的,不会被其他 Goroutine 中断。

使用通道(Channel)

另一种方法是使用无缓冲的通道来实现日志记录的串行化,从而避免显式地使用互斥锁。通过将日志记录请求发送到通道,然后在单个 Goroutine 中处理日志记录,可以实现线程安全的日志记录。

示例代码:

package mainimport ("fmt"
)type Logger struct {logChan chan string
}func NewLogger() *Logger {logger := &Logger{logChan: make(chan string),}go logger.processLogs()return logger
}func (l *Logger) Log(message string) {l.logChan <- message
}func (l *Logger) processLogs() {for {select {case message := <-l.logChan:fmt.Println(message)}}
}func main() {logger := NewLogger()// 并发写入日志for i := 0; i < 10; i++ {go func(i int) {logger.Log(fmt.Sprintf("Log entry %d", i))}(i)}// 等待所有 Goroutine 结束fmt.Scanln()
}

在上面的示例中,Logger 结构体包含一个 logChan 通道,通过 NewLogger 函数创建一个新的 Logger 实例,并启动一个 Goroutine 来处理 logChan 中的日志记录请求。这样可以确保日志记录的串行化,避免了显式的锁定。

使用第三方库

除了上述的原生方法外,还可以考虑使用第三方库,如 logruszap 等,这些库通常提供了高级的日志记录功能,并且已经考虑了并发安全性和性能优化。

示例代码(使用 logrus):

package mainimport ("fmt""github.com/sirupsen/logrus"
)func main() {logger := logrus.New()// 并发写入日志for i := 0; i < 10; i++ {go func(i int) {logger.Infof("Log entry %d", i)}(i)}// 等待所有 Goroutine 结束fmt.Scanln()
}

在使用第三方库时,通常可以直接使用其提供的接口和方法,而不必担心并发安全性问题,因为这些库通常已经进行了充分的测试和优化。

总结来说,实现并发安全的日志记录可以通过使用互斥锁、通道或者成熟的第三方库来实现。选择哪种方法取决于具体需求和性能要求。

总结

在准备 Go 语言面试时,以下是一些重要的知识点和主题,这些知识点涵盖了从基础到高级的内容,面试者应该掌握这些内容以展示对 Go 语言全面理解和实际应用能力。

1. 基础语法和数据类型

  • 变量声明和初始化:理解 var:= 等变量声明和初始化方式,了解数据类型如 intstringboolfloat64 等。
  • 控制流:熟悉 ifforswitch 语句的使用及其语法特点。
  • 函数定义和调用:函数的定义、参数传递(值传递和引用传递)、多返回值。
  • 方法和接收器:了解如何定义方法,并理解 receiver 在方法中的作用。

2. 并发和并行

  • Goroutine:理解 Goroutine 的概念、如何创建和管理 Goroutine,以及 Goroutine 的调度机制。
  • Channel:了解 Channel 的使用场景、如何声明和初始化 Channel、发送和接收操作,以及关闭 Channel。
  • 并发安全:掌握使用互斥锁 sync.Mutexsync.RWMutex 以及 sync.WaitGroup 等来确保并发安全。

3. 数据结构和内存管理

  • Slice 和数组:理解 Slice 和数组的区别、如何创建和操作 Slice。
  • Map:了解 Map 的基本用法、插入和删除操作、并发安全性问题。
  • 内存管理:掌握 Go 的垃圾回收机制、如何避免内存泄漏、避免过度分配内存。

4. 错误处理和日志记录

  • 错误处理:熟悉 error 接口、errors.Newfmt.Errorf 等创建错误的方式,理解如何进行错误处理和链式调用。
  • 日志记录:掌握如何并发安全地记录日志,使用 sync.Mutexsync.Pool 或者第三方库如 logruszap 等。

5. 包管理和依赖

  • 包导入:理解如何导入标准库和第三方库,如何组织自己的代码为包。
  • 模块管理:了解 Go 模块管理工具 go mod 的基本使用、版本管理、依赖管理。

6. 测试和性能优化

  • 单元测试:如何编写和运行单元测试,了解 testing 包的基本用法和常用断言。
  • 性能优化:熟悉性能分析工具 pprof 的使用、如何定位和解决性能瓶颈、优化并发和内存使用。

7. 高级特性和设计模式

  • 接口和多态:理解 Go 中接口的特性和用法,如何实现接口、接口的组合和多态。
  • 并发模式:熟悉并发设计模式如生产者消费者模式、工作池模式等在 Go 中的实现。
  • 反射和类型断言:了解反射的基本概念、reflect 包的使用场景,以及如何进行类型断言。

8. Web 开发和框架

  • HTTP 服务:了解如何使用 net/http 包创建 HTTP 服务、路由、中间件的使用。
  • Web 框架:了解常用的 Go Web 框架如 Gin、Echo 的基本用法和优劣比较。

9. 平台和工具

  • 跨平台开发:理解 Go 的跨平台特性,如何在不同操作系统上编译和运行 Go 程序。
  • 工具链:熟悉 go 命令行工具的使用,包括构建、测试、安装依赖、生成文档等。

10. 最佳实践和代码规范

  • Go 语言规范:遵循官方的 Go 语言编码规范,了解如何编写清晰、高效、易维护的 Go 代码。
  • 错误处理和日志:掌握良好的错误处理和日志记录实践,确保代码的健壮性和可维护性。

通过掌握以上这些知识点,面试者可以展示出对 Go 语言的深入理解和实际应用能力,从而在面试中脱颖而出。


💗💗💗 如果觉得这篇文对您有帮助,请给个点赞、关注、收藏吧,谢谢!💗💗💗

相关文章:

【面试系列】Go 语言高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…...

React 扩展

文章目录 PureComponent1. 使用 React.Component&#xff0c;不会进行浅比较2. 使用 shouldComponentUpdate 生命周期钩子&#xff0c;手动比较3. 使用 React.PureComponent&#xff0c;自动进行浅比较 Render Props1. 使用 Children props&#xff08;通过组件标签体传入结构&…...

IT入门知识第八部分《云计算》(8/10)

目录 云计算&#xff1a;现代技术的新篇章 1. 云计算基础 1.1 云计算的起源和发展 云计算的早期概念 云计算的发展历程 1.2 云计算的核心特点 按需自助服务 广泛的网络访问 资源池化 快速弹性 按使用量付费 1.3 云计算的优势和挑战 成本效益 灵活性和可扩展性 维…...

Linux-笔记 全志T113移植正点4.3寸RGB屏幕笔记

目录 前言 线序整理 软件 显示调试 触摸调试 背光调试 前言 由于手头有一块4.3寸的RGB屏幕(触摸IC为GT1151)&#xff0c;正好开发板上也有40Pin的RGB接口&#xff0c;就想着给移植一下&#xff0c;前期准备工作主要是整理好线序&#xff0c;然后用转接板与杜邦线连接验证好…...

Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令

0 前言 系统进程信息是电脑网络信息安全检查中的一块重要内容&#xff0c;对于使用Linux和基于Linux作为操作系统的电脑来说&#xff0c;可以使用ps命令。 1 ps命令 的功能、格式和选项说明 1.1 ps命令 的功能 Linux 中的ps&#xff08;意为&#xff1a;process status&…...

在Android中使用ProgressBar显示进度

在Android中使用ProgressBar显示进度 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Android应用中使用ProgressBar来显示进度。ProgressB…...

Java基础面试题(简单版):

1.java的8个基本数据类型? 整型: byte(占用1个字节) short(占用2个字节) int(占用4个字节) long(占用8个字节) 浮点型: float(占用4个字节)、double(占用8个字节) 字符型: char 布尔型: boolean 2.ArrayList和LinkedList的区别? 可以说ArrayList和LinkedList除了是同属于集合…...

​Chrome插件:Postman Interceptor 调试的终极利器

今天给大家介绍一款非常实用的工具——Postman Interceptor。 这个工具可以捕捉任何网站的请求&#xff0c;并将其发送到Postman客户端。 对于经常和API打交道的程序员来说&#xff0c;Postman Interceptor真的是神器级别的存在。 下面就让我详细说说这个插件怎么用&#xf…...

SpringBoot学习04-[定制SpringMVC]

定制SpringMVC 定制SpringMvc的自动配置定制springmvc-configurePathMatch配置定制SpringMVC-拦截器Interceptor定制SpringMVC-CORS配置全局cors配置针对某个方法加跨域解决 WebMvcConfigurer原理定制SpringMVC-JSONJSON开发jackson的使用定制化json序列化和反序列化 JSON国际化…...

QT拖放事件之六:自定义MIME类型的存储及读取demo

1、MIME类型描述 MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。 MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL…...

架构师必知的绝活-JVM调优

前言 为什么要学JVM&#xff1f; 首先&#xff1a;面试需要 了解JVM能帮助回答面试中的复杂问题。面试中涉及到的JVM相关问题层出不穷&#xff0c;难道每次面试都靠背几百上千条面试八股&#xff1f; 其次&#xff1a;基础知识决定上层建筑 自己写的代码都不知道是怎么回事&a…...

小米平板6系列对比

小米平板6系列目前有4款&#xff0c;分别为6、6 Pro、6 Max、6S Pro。具体对比如下表所示。 小米平板型号66 Pro6 Max6S Pro实物图发布时间2023年4月21日2023年4月21日2023年8月14日2024年2月22 日屏幕大小11英寸11英寸14英寸12.4英寸分辨率2.8K2.8K2.8K3K刷新率144Hz144Hz120…...

用 Rust 实现一个替代 WebSocket 的协议

很久之前我就对websocket颇有微词&#xff0c;它的确满足了很多情境下的需求&#xff0c;但是仍然有不少问题。对我来说&#xff0c;最大的一个问题是websocket的数据是明文传输的&#xff0c;这使得websocket的数据很容易遭到劫持和攻击。同时&#xff0c;WebSocket继承自HTTP…...

【docker】2. 编排容器技术发展史(了解)

该篇文章介绍的主要是编排以及容器技术的发展史(了解即可)&#xff0c;如果想单纯学习docker命令操作可直接略过&#xff01;&#xff01;&#xff01; 容器技术发展史 Jail 时代 容器不是一个新概念或者新技术&#xff0c;很早就有了&#xff0c;只是近几年遇到了云计算&am…...

吉利银河L6(官方小订送的3M) 对比 威固vk70+ks15

吉利送的号称价值2000的3M效果 撕膜重贴 威固vk70ks15 之后的效果 // 忘记测反射的热量了 可以验证金属膜是反射热而不是吸热 金属膜 手机GPS还能用吗 亲测 能用 太阳能总阻隔率 3M貌似20%出头 威固前档55% 侧后挡高一点不超过60% 夏天真实太阳发热能量 即阻隔率55%到60% …...

three.js实现雪花场景效果

点击获取雪花图片素材 提取码:lywa // 雪花效果 import * as THREE from "three" export function getsnowEffect(th) {console.log(th, th) // this 场景var that th// 创建一个BufferGeometry对象&#xff0c;用于存储顶点数据 const geometry new THREE.Buffe…...

鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一

一、鸿蒙开发环境搭建 DevEco Studio安装 下载 访问官网&#xff1a;https://developer.huawei.com/consumer/cn/deveco-studio/选择操作系统版本后并注册登录华为账号既可下载安装包 安装 建议&#xff1a;软件和依赖安装目录不要使用中文字符软件安装包下载完成后&#xff0…...

Elasticsearch优化索引映射和设置

在Elasticsearch的世界中&#xff0c;优化索引的映射&#xff08;mapping&#xff09;和设置&#xff08;settings&#xff09;对于提高搜索性能、存储效率和系统稳定性至关重要。本文将带您深入了解如何针对Elasticsearch的索引进行优化&#xff0c;帮助您构建更高效、更可靠的…...

boss直聘招聘数据可视化分析

boss直聘招聘数据可视化分析 一、数据预处理二、数据可视化三、完整代码一、数据预处理 在 上一篇博客中,笔者已经详细介绍了使用selenium爬取南昌市web前端工程师的招聘岗位数据,数据格式如下: 这里主要对薪水列进行处理,为方便处理,将日薪和周薪的数据删除,将带有13薪…...

小程序人脸分析

公司的业务需求是用户在使用某个功能前&#xff0c;必须使用人脸识别&#xff0c;确保当前使用人是用户本人&#xff0c;防止某些功能乱用。后端用的是腾讯的人脸识别方案&#xff0c;这里只是前端的识别代码&#xff0c;保证人脸剧中&#xff0c;大小合适&#xff0c;有一个人…...

UML建模笔记

5个视图 设计。类&#xff0c;接口&#xff0c;对象如何协作。实现。组件&#xff0c;运行程序&#xff0c;文档关系。用例。用户功能期望。进程。并发与同步相关进程&#xff0c;线程。部署。部署到计算机。 建模目的 和客户共创追踪需求变更协同开发进度控制持续迭代测试生…...

初见SpringCloud ing

Consul 服务注册与发现 服务注册与发现 服务注册&#xff1a;微服务在启动时&#xff0c;会将自己的信息&#xff08;如 IP 地址、端口、服务名称等&#xff09;注册到 Consul。 服务发现&#xff1a;其他微服务可以通过 Consul 查询到已注册的服务&#xff0c;并通过这些信息…...

Python | Leetcode Python题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; class Solution:def rob(self, nums: List[int]) -> int:if not nums:return 0size len(nums)if size 1:return nums[0]first, second nums[0], max(nums[0], nums[1])for i in range(2, size):first, second second, max(first nu…...

什么是中断?---STM32篇

目录 一&#xff0c;中断的概念 二&#xff0c;中断的意义 三&#xff0c;中断的优先级 四&#xff0c;中断的嵌套 如果一个高优先级的中断发生&#xff0c;它会立即打断当前正在处理的中断&#xff08;如果其优先级较低&#xff09;&#xff0c;并首先处理这个高优…...

51单片机第1步_putchar()和_getkey()应用

没有开发板&#xff0c;没有烧录器&#xff0c;没有学习场所&#xff0c;如何学习写51单片机的程序&#xff1f;除了采用软件模拟仿真&#xff0c;没有更好的方法&#xff0c;因此&#xff0c;使用串口是学习的第一步。 1、_getkey ()函数 在C:\Keil\C51\LIB中有一个叫GETKEY…...

微信小程序中的地图的使用

微信小程序中的地图组件 是一个用于展示地图的组件&#xff0c;提供了丰富的功能和配置选项&#xff0c;可以实现定位、标记、路线规划等多种地图相关的交互。下面是对这个组件的详细介绍&#xff0c;包括属性、事件以及示例代码。 组件属性 基础属性 longitude: 地图中心的经…...

MySQL root密码丢失处理

没有记住MySQL数据库root用户默认密码(为初始化安装mysql时默认生成) 1)修改/etc/my.cnf文件,在[mysqld]的段中加上一句:skip-grant-tables 重启mysql服务 [root@localhost ~]# service mysqld restart 2)以无密码方式进入mysql: [root@localhost ~]# /usr/local/my…...

RabbitMQ中java实现队列和交换机的声明

java实现队列和交换机的声明 在之前我们都是基于RabbitMQ控制台来创建队列、交换机。但是在实际开发时&#xff0c;队列和交换机是程序员定义的&#xff0c;将来项目上线&#xff0c;又要交给运维去创建。那么程序员就需要把程序中运行的所有队列和交换机都写下来&#xff0c;…...

解决SPA(单页应用)首屏加载速度慢

SPA是目前流行的前端开发模式&#xff0c;相对于传统的多页面用户体验更好&#xff0c;操作更顺畅&#xff0c;开发效率也更高。但是SPA首屏加载速度慢一直是个致命的问题&#xff0c;由于SPA应用首次打开需要一次性加载大量的静态资源&#xff0c;这就导致了加载速度慢的问题&…...

ElementUI框架搭建及组件使用

前言: 当开始使用ElementUI框架来搭建网站或Web应用程序时&#xff0c;了解框架的基本结构和组件的使用是至关重要的。ElementUI是一个基于Vue.js的框架&#xff0c;提供了丰富的UI组件和工具&#xff0c;可以帮助开发人员快速构建现代化的用户界面。 在本文中&#xff0c;我…...

同三维T908转换器 SDI转DVI/HDMI/VGA/色差分量/AV转换器

同三维T908转换器 SDI转DVI/HDMI/VGA/色差分量/AV转换器 1路SDI进&#xff0c;1路DVI(可转HDMI/VGA/色差分量/AV)3.5音频1路SDI出,可以支持音频解嵌&#xff0c;也可把3.5音频加嵌转换输出&#xff0c;输出分辨率可调&#xff0c;支持图像翻转180度 一、产品简介 SDI转万能转…...

【设计模式】【创建型5-5】【原型模式】

文章目录 原型模式代码示例 原型模式 代码使用&#xff1a;spring框架里 bean的作用域 用途&#xff0c;以原型为模板&#xff0c;源源不断的创建&#xff08;克隆 clone&#xff09;对象。当直接创建对象的代价比较大时&#xff0c;则采用这种模式。 代码示例 public class…...

原子变量原理剖析

一、原子操作 原子操作保证指令以原子的方式执行&#xff0c;执行过程不被打断。先看一个实例&#xff0c;如下所示&#xff0c;如果thread_func_a和thread_func_b同时运行&#xff0c;执行完成后&#xff0c;i的值是多少&#xff1f; // test.c static int i 0;void thread…...

WebSocket走私实践(附赠LiveGBS监控系统未授权管理员密码重置)

WebSocket走私实践&#xff08;附赠LiveGBS监控系统未授权管理员密码重置&#xff09; 对此&#xff0c;我特别感谢TryHackMe和HackTheBox academy&#xff0c;永远相信和追随英国TryHackMe所教导的网络安全知识,并保持学习 WebSocket走私相关的知识在这里 前段时间学习过htt…...

CentOS 7 和 CentOS Stream 8 的主要区别

更新频率&#xff1a; CentOS 7&#xff1a;传统的稳定版本&#xff0c;主要用于生产环境&#xff0c;更新频率较低&#xff0c;主要包含安全补丁和重要修复。CentOS Stream 8&#xff1a;滚动发布版本&#xff0c;更新更频繁&#xff0c;包含最新的特性和改进。它处于 Fedora …...

基于go1.19的站点模板爬虫

一、go1.19 go1.19是Go语言的一个版本,于2021年8月发布。它带来了许多新的功能和改进,包括但不限于以下方面: 并发性能改进:go1.19引入了新的调度器算法,称为“网状调度器(netlink scheduler)”,它可以更好地处理大量并发任务,在某些情况下提高了系统的并发能力。 垃…...

(单机版)神魔大陆|v0.51.0|冰火荣耀

前言 今天给大家带来一款单机游戏的架设&#xff1a;神魔大陆v0.51.0:冰火荣耀。 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; (单机版)神魔大陆 下面我将详细的教程交给大家&#xff0c;请耐心阅…...

k8s自动补全工具和UI管理界面

分享两个有利于K8S的工具 目录 分享两个有利于K8S的工具 一、部署Dashboard&#xff08;主节点&#xff09; 介绍 1.1、查看集群状态 1.2、下载yaml文件并运行Dashboard 1.3、部署服务 1.4、创建访问账户、获取token&#xff08;令牌&#xff09; 1.5、浏览器访问Dash…...

内网渗透:内网基础信息收集

Windows&#xff1a; whoami:查看当前当前主机名和登录用户名 whoami /user : 打印当前主机名和输出SID ​ SID的最后一个数字&#xff1a; 1000&#xff1a;普通管理员 500&#xff1a;administrator 501&#xff1a;Guest 516&#xff1a;域控 544&#xff1a;域管理员 net…...

cos符号链提示是什么?TOT呢?

**关于cos符号链提示&#xff08;Chain-of-Symbol Prompting, CoS&#xff09;**&#xff1a; Chain-of-Symbol Prompting&#xff08;CoS&#xff09;是用于大型语言模型&#xff08;LLMs&#xff09;的一种新的提示方法。它旨在解决LLMs在空间场景中的理解和规划问题&#xf…...

docker-compose部署Flink及Dinky

docker-compose部署Flink及Dinky 服务器环境&#xff1a;centos7 1. 配置hosts vim /etc/hostsx.x.x.x jobmanager x.x.x.x taskmanager x.x.x.x dinky-mysql2. 文件目录结构 . ├── conf │ ├── JobManager │ │ ├── flink-conf.yaml │ │ ├── log…...

数字时代的文化革命:Facebook的社会影响

随着数字技术的飞速发展和互联网的普及&#xff0c;社交网络如今已成为人们日常生活中不可或缺的一部分。在众多社交平台中&#xff0c;Facebook作为最大的社交网络之一&#xff0c;不仅连接了全球数十亿用户&#xff0c;更深刻影响了人们的社会互动方式、文化认同和信息传播模…...

66.前端接口调用返回400的错误

错误代码400通常表示由于无效的请求导致服务器无法处理请求。这可能是由于以下原因之一&#xff1a; 1.语法错误&#xff1a;客户端发送的请求可能存在语法错误&#xff0c;例如缺少必需的参数、格式不正确等。 2.未授权&#xff1a;如果API需要认证&#xff0c;而客户端没有提…...

Hadoop 安装与伪分布的搭建

目录 1 SSH免密登录 1.1 修改主机名称 1.2 修改hosts文件 1.3 创建hadoop用户 1.4 生成密钥对免密登录 2 搭建hadoop环境与jdk环境 2.1 将下载好的压缩包进行解压 2.2 编写hadoop环境变量脚本文件 2.3 修改hadoop配置文件&#xff0c;指定jdk路径 2.4 查看环境是否搭建完成 3 …...

网络安全:渗透测试思路.(面试)

网络安全&#xff1a;渗透测试思路.&#xff08;面试&#xff09; 渗透测试&#xff0c;也称为 "pen testing"&#xff0c;是一种模拟黑客攻击的网络安全实践&#xff0c;目的是评估计算机系统、网络或Web应用程序的安全性. 目录&#xff1a; 网络安全&#xff1a;…...

优化堆排序

优化堆排序 堆排序是一种基于比较的排序算法,它利用堆这种数据结构来进行排序。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序算法分为两个大的步骤:首先将待排序的序列构造成一个最大堆,此时,整个序…...

vue3使用一些组件的方法

iconpark...

OceanBase 4.2.1 离线安装

OceanBase 4.2.1 离线安装 4.2 版本的OceanBase支持一键安装&#xff0c;所以在线版本的安装简单了很多&#xff0c;但在无法连接网络的情况下安装就只能手动离线安装。 注&#xff1a;如下安装过程都是在同一台机器上面进行&#xff0c;也就是只有一个节点&#xff0c;多个节…...

ForkJoin

线程数超过CPU核心数是没有任何意义的【因为要使用CPU密集型运算】 Fork/Join&#xff1a;线程池的实现&#xff0c;体现是分治思想&#xff0c;适用于能够进行任务拆分的 CPU 密集型运算&#xff0c;用于并行计算 任务拆分&#xff1a;将一个大任务拆分为算法上相同的小任务…...

实验2 色彩模式转换

1. 实验目的 ①了解常用的色彩模式&#xff0c;理解色彩模式转换原理&#xff1b; ②掌握Photoshop中常用的颜色管理工具和色彩模式转换方法&#xff1b; ③掌握使用Matlab/PythonOpenCV编程实现色彩模式转换的方法。 2. 实验内容 ①使用Photoshop中的颜色管理工具&#xff…...