【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用

在这里插入图片描述

🔥 个人主页:空白诗
🔥 热门专栏:【Go语言精进之路】

在这里插入图片描述

文章目录

    • 引言
    • 一、Go语言的字符串类型
      • 1.1 字符串的定义
      • 1.2 字符串的零值可用
      • 1.3 字符串的不可变性
      • 1.4 字符串的拼接
      • 1.5 字符串的常用方法
      • 1.6 实际使用示例
    • 二、字符串的内部表示
      • 2.1 字符串的底层结构
      • 2.2 字符串与字节切片的关系
        • 字符串转换为字节切片
        • 字节切片转换为字符串
      • 2.3 字符串的编码
        • 遍历字符串
      • 2.4 不可变性的实现
      • 2.5 字符串的内存管理
      • 2.6 字符串池
    • 三、字符串的高效构造
      • 3.1 使用 strings.Builder
        • 示例:
        • 性能优势:
      • 3.2 使用字节缓冲区
        • 示例:
        • 性能优势:
      • 3.3 预分配切片
        • 示例:
        • 性能优势:
      • 3.4 使用 strings.Join
        • 示例:
        • 性能优势:
      • 3.5 选择合适的方法
    • 四、字符串相关的高效转换
      • 4.1 字符串与数字的转换
        • 字符串转换为整数
        • 整数转换为字符串
      • 4.2 字符串与字节切片的转换
        • 字符串转换为字节切片
        • 字节切片转换为字符串
      • 4.3 字符串与字符(rune)的转换
        • 字符串转换为字符切片
        • 字符切片转换为字符串
      • 4.4 字符串与其他数据类型的转换
        • 布尔值转换
        • 浮点数转换
    • 总结

在这里插入图片描述

引言

在Go语言中,字符串是一个重要且经常使用的数据类型。无论是处理文本数据、构建复杂字符串,还是在不同数据类型之间进行转换,高效的字符串操作都对程序性能至关重要。本篇文章将深入探讨Go语言中的字符串类型,从基本的字符串定义和操作,到字符串的内部表示,再到高效的字符串构造和转换方法,通过全面的讲解和实例代码,帮助读者更好地理解和使用Go语言的字符串功能。

一、Go语言的字符串类型

在这里插入图片描述

在Go语言中,字符串类型是非常重要且经常使用的数据类型。字符串用于存储字符序列,在Go语言中,它们是不可变的。这意味着一旦创建了字符串,它的内容是无法更改的。接下来,我们将深入了解Go语言的字符串类型,包括它的定义、操作、常用方法以及一些实际的使用示例。

1.1 字符串的定义

在Go语言中,字符串使用双引号 " 包裹起来。例如:

package mainimport "fmt"func main() {var str1 string = "Hello, World!"str2 := "Go语言"fmt.Println(str1)fmt.Println(str2)
}

上述代码定义了两个字符串变量 str1str2,并打印它们的值。Go语言支持UTF-8编码,这意味着字符串可以包含多种语言的字符。

1.2 字符串的零值可用

在Go语言中,字符串类型的零值是一个空字符串,也就是 ""。这意味着当你声明一个字符串变量但未对其进行初始化时,它的默认值是空字符串。这种特性可以帮助我们在编写代码时避免出现空指针异常的问题。

package mainimport "fmt"func main() {var str stringfmt.Println("字符串的零值:", str) // 输出:字符串的零值:fmt.Println("字符串是否为空:", str == "") // 输出:字符串是否为空: true
}

在这个例子中,变量 str 声明后未被初始化,因此它的值是空字符串。我们可以通过比较操作 str == "" 来确认这一点。

1.3 字符串的不可变性

Go语言中的字符串是不可变的,这意味着你不能直接修改字符串中的某个字符。例如,以下代码是非法的:

package mainfunc main() {str := "Hello"str[0] = 'h' // 编译错误:cannot assign to str[0]
}

如果需要修改字符串,可以创建一个新的字符串。例如:

package mainimport "fmt"func main() {str := "Hello"newStr := "h" + str[1:]fmt.Println(newStr) // 输出:hello
}

1.4 字符串的拼接

Go语言提供了多种方法来拼接字符串。最常用的方法是使用 + 操作符:

package mainimport "fmt"func main() {str1 := "Hello"str2 := "World"result := str1 + ", " + str2 + "!"fmt.Println(result) // 输出:Hello, World!
}

对于大量字符串的拼接,推荐使用 strings.Builder,因为它更加高效:

package mainimport ("fmt""strings"
)func main() {var builder strings.Builderbuilder.WriteString("Hello")builder.WriteString(", ")builder.WriteString("World")builder.WriteString("!")result := builder.String()fmt.Println(result) // 输出:Hello, World!
}

1.5 字符串的常用方法

Go语言的 strings 包提供了许多用于操作字符串的函数。以下是一些常用方法:

  • len(s):返回字符串的长度(字节数)。
  • strings.Split(s, sep):将字符串按指定分隔符拆分成子串数组。
  • strings.Join(a, sep):将字符串数组按指定分隔符合并成一个字符串。
  • strings.Contains(s, substr):判断字符串是否包含子串。
  • strings.ToUpper(s)strings.ToLower(s):将字符串转换为大写或小写。

示例:

package mainimport ("fmt""strings"
)func main() {str := "Hello, Go语言!"fmt.Println("长度:", len(str)) // 输出:长度: 14parts := strings.Split(str, ", ")fmt.Println("拆分:", parts) // 输出:拆分: [Hello Go语言!]joined := strings.Join(parts, " - ")fmt.Println("合并:", joined) // 输出:合并: Hello - Go语言!fmt.Println("包含 'Go':", strings.Contains(str, "Go")) // 输出:包含 'Go': truefmt.Println("大写:", strings.ToUpper(str)) // 输出:大写: HELLO, GO语言!fmt.Println("小写:", strings.ToLower(str)) // 输出:小写: hello, go语言!
}

1.6 实际使用示例

以下是一个实际使用字符串的示例:检查一个字符串是否是回文(即正读和反读都一样)。

package mainimport ("fmt""strings"
)func isPalindrome(s string) bool {s = strings.ToLower(s)s = strings.ReplaceAll(s, " ", "")s = strings.ReplaceAll(s, ",", "")s = strings.ReplaceAll(s, "!", "")n := len(s)for i := 0; i < n/2; i++ {if s[i] != s[n-1-i] {return false}}return true
}func main() {str := "A man, a plan, a canal, Panama!"fmt.Println("是否是回文:", isPalindrome(str)) // 输出:是否是回文: true
}

在这个示例中,我们定义了一个函数 isPalindrome 来检查字符串是否是回文。我们使用 strings 包提供的方法来处理字符串并进行检查。

通过上述内容,我们可以了解到Go语言中字符串类型的基本概念和常用操作方法。字符串在编程中无处不在,掌握其使用方法对于Go语言开发非常重要。


二、字符串的内部表示

在这里插入图片描述

在Go语言中,字符串的内部表示方式决定了它的高效性和灵活性。了解字符串的内部结构对于理解其性能特征和行为至关重要。本部分将详细介绍Go语言中字符串的内部表示。

2.1 字符串的底层结构

在Go语言中,字符串是一个只读的字节切片。实际上,字符串是一个结构体,它包含一个指向底层字节数组的指针和一个长度字段。Go语言的字符串定义如下:

type string struct {data uintptrlen  int
}

这里,data 是一个指向实际存储字符串内容的字节数组的指针,而 len 则是字符串的长度。这个设计使得字符串可以高效地进行长度计算和内容访问。

2.2 字符串与字节切片的关系

由于字符串在内部是一个字节数组,因此可以方便地与字节切片进行互相转换。

字符串转换为字节切片

将字符串转换为字节切片是一个常见的操作,可以使用标准库中的 []byte 类型转换:

package mainimport "fmt"func main() {str := "Hello, Go语言!"byteSlice := []byte(str)fmt.Println(byteSlice) // 输出:[72 101 108 108 111 44 32 71 111 232 175 173 232 168 128 33]
}
字节切片转换为字符串

将字节切片转换为字符串也非常简单,可以直接使用 string 类型转换:

package mainimport "fmt"func main() {byteSlice := []byte{72, 101, 108, 108, 111, 44, 32, 71, 111, 232, 175, 173, 232, 168, 128, 33}str := string(byteSlice)fmt.Println(str) // 输出:Hello, Go语言!
}

2.3 字符串的编码

Go语言的字符串默认使用UTF-8编码,这使得字符串可以方便地处理多种语言的字符。UTF-8是一种变长编码,ASCII字符使用一个字节,而其他字符使用两个到四个字节不等。

遍历字符串

遍历字符串时,需要注意字符的编码。直接遍历字符串实际上是遍历其字节,这可能导致非ASCII字符被错误处理。可以使用 for range 循环来正确遍历UTF-8编码的字符串:

package mainimport "fmt"func main() {str := "Hello, Go语言!"for i, r := range str {fmt.Printf("字符 %c 的位置 %d\n", r, i)}
}

在这个例子中,for range 循环能够正确处理多字节的UTF-8字符,并返回字符的索引和Unicode码点。

2.4 不可变性的实现

字符串的不可变性是通过不提供直接修改字符串内容的方法来实现的。一旦字符串被创建,无法通过其指针或其他方式修改其内容。这种设计在提升字符串操作的安全性和并发性方面有显著优势,因为无需担心多个线程对同一个字符串进行修改。

如果需要修改字符串,可以创建一个新的字符串。例如:

package mainimport "fmt"func main() {str := "Hello"newStr := "h" + str[1:]fmt.Println(newStr) // 输出:hello
}

2.5 字符串的内存管理

由于字符串是不可变的,Go语言在处理字符串时尽量避免不必要的内存分配。对于短小的字符串,Go语言的运行时会优化其内存分配。例如,对于长度为零的字符串,Go语言会将其指针指向一个共享的空字符串,而不是为每个空字符串分配单独的内存。

2.6 字符串池

Go语言在编译时会将相同的字符串常量合并到一个字符串池中。这意味着在程序的不同部分使用相同的字符串常量时,它们实际上指向的是内存中的同一个位置。这样可以减少内存使用和提高字符串比较的效率。

例如:

package mainimport "fmt"func main() {str1 := "Hello, World!"str2 := "Hello, World!"fmt.Println(&str1 == &str2) // 输出:true
}

在这个例子中,str1str2 实际上指向同一个字符串常量。

通过了解Go语言中字符串的内部表示,我们可以更好地理解字符串操作的性能和行为,从而在开发中更高效地使用字符串。


三、字符串的高效构造

在这里插入图片描述

在Go语言中,高效地构造字符串对于提升程序性能至关重要。特别是在需要频繁拼接或处理大量字符串的场景下,合理的字符串构造方式可以显著减少内存分配和提升执行效率。本部分将介绍几种常用的高效构造字符串的方法,包括使用 strings.Builder、字节缓冲区和预分配切片等技术。

3.1 使用 strings.Builder

strings.Builder 是Go语言标准库中的一种高效构造字符串的方法。它通过内部维护一个可变的字节缓冲区,避免了频繁的内存分配和复制操作。

示例:
package mainimport ("fmt""strings"
)func main() {var builder strings.Builderbuilder.WriteString("Hello")builder.WriteString(", ")builder.WriteString("Go语言")builder.WriteString("!")result := builder.String()fmt.Println(result) // 输出:Hello, Go语言!
}
性能优势:
  • 减少内存分配strings.Builder 通过内部的缓冲区来管理字节数组,避免了每次拼接操作时创建新的字符串。
  • 高效拼接:多次调用 WriteString 方法可以累积字符串内容,最终通过 String 方法生成最终字符串。

3.2 使用字节缓冲区

bytes.Buffer 是另一种高效构造字符串的工具,特别适用于需要处理二进制数据和字符串混合的场景。

示例:
package mainimport ("bytes""fmt"
)func main() {var buffer bytes.Bufferbuffer.WriteString("Hello")buffer.WriteString(", ")buffer.WriteString("Go语言")buffer.WriteString("!")result := buffer.String()fmt.Println(result) // 输出:Hello, Go语言!
}
性能优势:
  • 灵活性bytes.Buffer 不仅可以处理字符串,还可以处理其他类型的二进制数据。
  • 线程安全:与 strings.Builder 类似,bytes.Buffer 也能有效地减少内存分配和复制操作。

3.3 预分配切片

在知道最终字符串长度的情况下,可以通过预分配字节切片来提高拼接效率。这种方法适用于构造定长或接近定长的字符串。

示例:
package mainimport "fmt"func main() {parts := []string{"Hello", ", ", "Go语言", "!"}totalLength := 0for _, part := range parts {totalLength += len(part)}buf := make([]byte, totalLength)pos := 0for _, part := range parts {copy(buf[pos:], part)pos += len(part)}result := string(buf)fmt.Println(result) // 输出:Hello, Go语言!
}
性能优势:
  • 减少内存分配:通过一次性分配足够的内存来存储所有字符串部分,避免了多次内存分配。
  • 高效拼接:使用 copy 函数直接将字符串内容复制到预分配的字节切片中。

3.4 使用 strings.Join

对于已知的多个字符串片段,可以使用 strings.Join 方法一次性拼接所有字符串。这种方法适用于字符串列表已知且固定的情况。

示例:
package mainimport ("fmt""strings"
)func main() {parts := []string{"Hello", ", ", "Go语言", "!"}result := strings.Join(parts, "")fmt.Println(result) // 输出:Hello, Go语言!
}
性能优势:
  • 简单高效strings.Join 方法内部会计算总长度并一次性分配内存,从而高效地拼接字符串。
  • 简洁代码:使用 strings.Join 可以使代码更加简洁明了。

3.5 选择合适的方法

在实际开发中,选择合适的字符串构造方法需要根据具体场景和需求来确定:

  • 大量拼接strings.Builder 是通用且高效的选择。
  • 二进制数据处理bytes.Buffer 更适合处理混合数据。
  • 已知长度:预分配切片可以提供最佳性能。
  • 固定片段拼接strings.Join 简洁且高效。

通过合理选择和使用这些方法,我们可以在不同场景下高效地构造字符串,从而提升Go语言程序的整体性能。

四、字符串相关的高效转换

在这里插入图片描述

在Go语言中,字符串与其他数据类型之间的转换是常见的操作。高效的转换方法不仅能够提升程序性能,还能减少不必要的内存分配和数据复制。本部分将介绍几种常见的字符串转换操作,包括字符串与数字、字符串与字节切片、字符串与字符(rune)的高效转换方法。

4.1 字符串与数字的转换

在许多应用场景中,我们需要在字符串和数字之间进行转换。Go语言标准库提供了 strconv 包来高效地处理这些转换。

字符串转换为整数

使用 strconv.Atoistrconv.ParseInt 将字符串转换为整数:

package mainimport ("fmt""strconv"
)func main() {str := "12345"num, err := strconv.Atoi(str)if err != nil {fmt.Println("转换错误:", err)} else {fmt.Println("转换后的整数:", num) // 输出:转换后的整数: 12345}
}
整数转换为字符串

使用 strconv.Itoastrconv.FormatInt 将整数转换为字符串:

package mainimport ("fmt""strconv"
)func main() {num := 12345str := strconv.Itoa(num)fmt.Println("转换后的字符串:", str) // 输出:转换后的字符串: 12345
}

4.2 字符串与字节切片的转换

字符串与字节切片之间的转换在处理二进制数据时非常常见。Go语言提供了高效的转换方式。

字符串转换为字节切片

使用类型转换 []byte 可以高效地将字符串转换为字节切片:

package mainimport "fmt"func main() {str := "Hello, Go语言!"byteSlice := []byte(str)fmt.Println("字节切片:", byteSlice) // 输出:字节切片: [72 101 108 108 111 44 32 71 111 232 175 173 232 168 128 33]
}
字节切片转换为字符串

使用类型转换 string 可以高效地将字节切片转换为字符串:

package mainimport "fmt"func main() {byteSlice := []byte{72, 101, 108, 108, 111, 44, 32, 71, 111, 232, 175, 173, 232, 168, 128, 33}str := string(byteSlice)fmt.Println("字符串:", str) // 输出:Hello, Go语言!
}

4.3 字符串与字符(rune)的转换

在处理多语言文本时,经常需要将字符串分割为字符 (rune) 进行处理。Go语言中的 rune 类型表示一个Unicode码点。

字符串转换为字符切片

使用 for range 循环可以高效地将字符串分割为字符切片:

package mainimport "fmt"func main() {str := "Hello, Go语言!"var runes []runefor _, r := range str {runes = append(runes, r)}fmt.Println("字符切片:", runes) // 输出:字符切片: [72 101 108 108 111 44 32 71 111 35821 35328 33]
}
字符切片转换为字符串

可以使用 string 函数将字符切片转换为字符串:

package mainimport "fmt"func main() {runes := []rune{72, 101, 108, 108, 111, 44, 32, 71, 111, 35821, 35328, 33}str := string(runes)fmt.Println("字符串:", str) // 输出:Hello, Go语言!
}

4.4 字符串与其他数据类型的转换

布尔值转换

使用 strconv.ParseBool 将字符串转换为布尔值:

package mainimport ("fmt""strconv"
)func main() {str := "true"boolVal, err := strconv.ParseBool(str)if err != nil {fmt.Println("转换错误:", err)} else {fmt.Println("转换后的布尔值:", boolVal) // 输出:转换后的布尔值: true}
}

使用 strconv.FormatBool 将布尔值转换为字符串:

package mainimport ("fmt""strconv"
)func main() {boolVal := truestr := strconv.FormatBool(boolVal)fmt.Println("转换后的字符串:", str) // 输出:转换后的字符串: true
}
浮点数转换

使用 strconv.ParseFloat 将字符串转换为浮点数:

package mainimport ("fmt""strconv"
)func main() {str := "123.45"floatVal, err := strconv.ParseFloat(str, 64)if err != nil {fmt.Println("转换错误:", err)} else {fmt.Println("转换后的浮点数:", floatVal) // 输出:转换后的浮点数: 123.45}
}

使用 strconv.FormatFloat 将浮点数转换为字符串:

package mainimport ("fmt""strconv"
)func main() {floatVal := 123.45str := strconv.FormatFloat(floatVal, 'f', 2, 64)fmt.Println("转换后的字符串:", str) // 输出:转换后的字符串: 123.45
}

通过了解和使用这些高效的字符串转换方法,我们可以在Go语言中更好地处理字符串与其他数据类型之间的转换,从而提升代码的性能和可读性。

总结

本文详细介绍了Go语言中字符串的各个方面。首先,我们讨论了字符串的基本定义和特性,包括字符串的零值、不可变性和常见操作。接着,我们深入探讨了字符串的内部表示,解释了字符串在内存中的结构和与字节切片的关系。随后,我们介绍了高效构造字符串的方法,包括使用 strings.Builder、字节缓冲区和预分配切片等技术。最后,我们展示了字符串与其他数据类型之间的高效转换方法。通过这些内容,希望读者能够掌握高效处理Go语言字符串的技巧,从而编写出性能更优的程序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多路h265监控录放开发-(1)建立head窗口并实现鼠标拖动整个窗口

头文件&#xff1a; //鼠标事件 用于拖动窗口//一下三个函数都是QWidget的可重载成员函数void mouseMoveEvent(QMouseEvent* ev) override;void mousePressEvent(QMouseEvent* ev) override;void mouseReleaseEvent(QMouseEvent* ev) override; 源文件&#xff1a; / /// 鼠标…

今年的618,似乎很平淡!

电商平台取消预售制度的第一个大促&#xff0c;快递业表现如何&#xff1f; 今年的618大促与往年有些不同&#xff0c;自4月起&#xff0c;天猫、京东、快手等主流平台相继官宣取消预售&#xff0c;打出“现货开卖”标签&#xff0c;这意味着消费者不用再被“烧脑”的优惠计算…

RoboDK试用期间提示无效或过期的许可证

问题描述 RoboDK下载下来在试用期间提示如下信息&#xff0c;不知道什么原因 临时解决方法 将C:\Users\${username}\AppData\Roaming\RoboDK该目录下的文件全部删除掉&#xff0c;便可以正常使用RoboDK应用了&#xff0c;但是等软件关闭后还是会出现上面的问题&#xff0c;…

【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格

目录 1. 前言 2. EasyExcel简介 3. EasyExcel简单导出案例讲解 3.1 EasyExcel依赖引入 3.2 测试类创建 3.3 Excel导出实现 4. EasyExcel合并单元案例讲解 4.1 实现自定义合并策略 4.2 使用自定义合并策略 5. 总结 1. 前言 项目上&#xff0c;需将一个列表数据导出Ex…

简易开发一个app

即时设计网站 即时设计 - 可实时协作的专业 UI 设计工具 需要先设计好UI界面 上传到codefun 首次需要安装 自动生成代码 打开hb软件 新建项目 打开创建的项目 删除代码 复制代码过去 下载图片 将图片放到文件夹里 改为这种格式 index.vue 如果不需要uni-app导航栏可以修改 …

ECharts 词云图案例二:创意蒙版应用

ECharts 词云图案例二&#xff1a;创意蒙版应用 引言 在数据可视化领域&#xff0c;ECharts 以其强大的功能性和灵活性&#xff0c;成为开发者和设计师的首选工具之一。继上一篇关于 ECharts 词云图的详细介绍后&#xff0c;本文将探索词云图的进阶应用——使用蒙版来创造更具…

生产看板管理系统内容有哪些?

相信很多做生产管理的朋友都会遇到如下问题&#xff0c;我就在想&#xff0c;是否能一个创建“透明的”的工作场所&#xff1f;让员工和管理者能够实时查询生产进度&#xff0c;及时发现生产中的问题。 生产进度难追踪 生产过程不透明 生产决策缺乏数据支持 ——能&#xf…

Blurry - hackthebox

简介 靶机名称&#xff1a;Blurry 难度&#xff1a;中等 靶场地址&#xff1a;https://app.hackthebox.com/machines/605 本地环境 靶机IP &#xff1a;10.10.11.19 linux渗透机IP(kali 2024.2)&#xff1a;10.10.16.17 windows渗透机IP&#xff08;windows11&#xff0…

虚拟机怎么额外搭建两个Redis节点,配置多个 Redis 实例

前提条件 在开始之前&#xff0c;请确保你已经具备以下条件&#xff1a; 一台已安装 Redis 的虚拟机。虚拟机上已安装基本的 Linux 工具&#xff08;例如 FinalShell&#xff09;。 步骤二&#xff1a;配置额外的 Redis 实例 接下来&#xff0c;我们将配置两个新的 Redis 实…

frp安装与配置

个人从网上杂乱的信息中学习、试错&#xff0c;记录自己成功配置的方法&#xff0c;避免遗忘 一、frp的下载 因目前无法下载&#xff0c;仅保留下载方法&#xff0c;版本号根据实际修改&#xff0c;目前使用0.54版&#xff0c;不同系统下载不同文件。 wget https://github.c…

【前端取不到cookie的的原因】http-only

某条cookie有http-only属性时&#xff0c;下面两种方法都取不到&#xff0c;还是改需求吧&#xff0c;别取了 1、 npm install js-cookie --save import Cookies from js-cookie let cookieValue Cookies.get(name)2、document.cookie

ChatGPT的问题与回复的内容导出(Chorme)

我给出两种方式&#xff0c;第一种方式无使用要求&#xff0c;第二种方式必须安装Chorme 个人更推荐第二种方式 第一种方式&#xff1a;使用chatgpt自带的数据导出 缺点&#xff1a;会将当前未归档的所有聊天记录导出&#xff0c;发送到你的电子邮箱中 第二种方式&#xff1a…

大模型技术工程师:抓住时代机遇,成为行业精英_

伴随AI大模型的火热&#xff0c;中国科技大厂们正在掀起一场「跑步AI化」的风暴。从顶层战略到业务线重构&#xff0c;AI无疑已成为大厂们押注未来的新故事。 大模型时代已经到来 大模型已成为全球竞争热点&#xff0c;一个大模型时代已经到来。 大模型具备三个特点&#xf…

智能网站管理系统

智能网站管理系统&#xff0c;即智能化的网站管理工具&#xff0c;是为了提高网站管理效率和简化操作流程而开发的一种软件系统。它集合了各种先进的技术和功能&#xff0c;为网站管理员提供了一套强大而可靠的解决方案。 智能网站管理系统的核心功能是网站内容管理。传统的网站…

css设置滚动条样式;滚动条设置透明

滚动条透明代码 .resizable-div {resize: both;/* 允许水平和垂直调整大小 */overflow: auto;/* 确保内容超出边界时出现滚动条 */ } /* 滚动条整体样式 */ .resizable-div::-webkit-scrollbar {width: 4px; /* 竖直滚动条宽度 */height: 4px; /* 水平滚动条高度 */ }/* 滚动条…

探索C嘎嘎的奇妙世界:第十四关---STL(string的模拟实现)

1. string类的模拟实现 1.1 经典的string类问题 上一关已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…

深度学习(九)——神经网络:最大池化的作用

一、 torch.nn中Pool layers的介绍 官网链接&#xff1a; https://pytorch.org/docs/stable/nn.html#pooling-layers 1. nn.MaxPool2d介绍 nn.MaxPool2d是在进行图像处理时&#xff0c;Pool layers最常用的函数 官方文档&#xff1a;MaxPool2d — PyTorch 2.0 documentation &…

11.docker镜像分层dockerfile优化

docker镜像的分层&#xff08;kvm 链接克隆&#xff0c;写时复制的特性&#xff09; 镜像分层的好处&#xff1a;复用,节省磁盘空间&#xff0c;相同的内容只需加载一份到内存。 修改dockerfile之后&#xff0c;再次构建速度快 分层&#xff1a;就是在原有的基础镜像上新增了服…

Thinkphp校园新闻发布系统源码 毕业设计项目实例

Thinkphp校园新闻发布系统源码 毕业设计项目实例 校园新闻发布系统模块&#xff1a; 用户模块&#xff1a;注册&#xff0c;登陆&#xff0c;查看个人信息&#xff0c;修改个人信息&#xff0c;站内搜索&#xff0c;新闻浏览等功能&#xff0c; 后台管理员模块&#xff1a;会员…

翻转数位00

题目链接 翻转数位 题目描述 注意点 可以将一个数位从0变为1找出能够获得的最长的一串1的长度&#xff08;必须是连续的&#xff09; 解答思路 参照题解使用动态规划解决本题&#xff0c;对于任意一个位置i&#xff0c;dp[i][0]表示到达且包含第i位不翻转0最长1的长度&…