Go语言学习笔记2 | 豆包MarsCode AI刷题

110 阅读5分钟

在学习Go语言的字符串时,我发现其设计简洁且高效,注重性能和安全性。与Python相比,Go的字符串操作更加直接,适合系统编程和高性能应用场景。通过掌握这些常见语法和特性,可以更好地处理文本数据并编写清晰、高效的代码。通过系统学习Go,能感受到它在性能、并发和简单易用性方面的优势。这不仅加深了对编程语言设计的理解,还培养了编写高效、可靠代码的习惯。在项目开发中,能够根据需求选择合适的工具,成为解决实际问题的高效开发者。

Go语言字符串语法详解

基本概念与定义

Go语言

在Go语言中,字符串(string)是一种基础数据类型,用于表示一系列的字符。字符串是不可变的,即一旦创建,无法修改其内容。每个字符串实际上是一个字节序列,可以包含Unicode字符。

Go语言中的字符串使用双引号 (") 或反引号 (`) 定义:

  • 双引号字符串:用于普通字符串,可以包含转义字符(如\n\t)。

  • 反引号字符串:用于多行字符串或包含特殊字符的原始字符串,不处理转义字符。

  • 使用双引号 (") 定义字符串:

    str := "Hello, Go"
    
  • 使用反引号 (``) 定义多行或原始字符串:

    rawStr := `Hello,
    This is a raw string in Go.`
    

Python

  • 使用单引号或双引号:

    str = "Hello, Python"
    raw_str = '''Hello,
    This is a raw string in Python.'''
    

C语言

  • 使用双引号定义字符串,通常以字符数组形式存储:

    char str[] = "Hello, C";
    

字符串的不可变性

与Python类似,Go中的字符串也是不可变的。一旦创建字符串,不能修改其内容。若需要改变字符串的某些内容,通常需要创建一个新的字符串。这种设计有助于提升性能和安全性。

Go语言

字符串是不可变的。一旦创建,无法修改其中的字符。

str := "Hello"
// str[0] = 'h'  // 错误,Go中字符串不可变

Python

Python中的字符串也不可变。

str = "Hello"
# str[0] = 'h'  # 错误,Python中字符串不可变

C语言

C中的字符串是可变的,可以通过字符数组修改。

char str[] = "Hello";
str[0] = 'h';  // 可以修改字符串内容

字符串长度

Go语言

Go语言的len()函数用于获取字符串的长度。需要注意的是,len()返回的是字节数而非字符数,因为Go字符串是UTF-8编码的,非ASCII字符可能占用多个字节。例如,汉字通常占用3个字节。

str := "Hello, 世界"
fmt.Println(len(str))  // 输出13'世界'每个字符占3字节

Python

len() 函数返回字符数(Python处理的是Unicode字符):

str = "Hello, 世界"
print(len(str))  # 输出9,按字符计算

C语言

使用 strlen() 计算字符串长度(不包括 '\0' 结束符):

#include <string.h>
char str[] = "Hello";
printf("%d", strlen(str));  // 输出5

字符串拼接

Go语言

Go语言中,字符串可以使用+运算符进行拼接。虽然直观简单,但在处理大量字符串拼接时,建议使用strings.Builderbytes.Buffer以提升性能。与Python的字符串拼接类似,但Go对性能更为敏感。

使用 + 运算符:

str1 := "Hello"
str2 := "Go"
result := str1 + ", " + str2  // "Hello, Go"

Python

同样使用 + 进行拼接:

str1 = "Hello"
str2 = "Python"
result = str1 + ", " + str2  # "Hello, Python"

C语言

使用 strcat() 进行字符串拼接:

#include <string.h>
char str1[20] = "Hello";
char str2[] = " C";
strcat(str1, str2);  // str1变为"Hello C"

多行字符串

Go支持使用反引号(`)创建多行字符串。这在编写包含多行文本、HTML、JSON或配置文件时非常方便。与Python的三引号多行字符串不同,Go中的反引号字符串保留了所有的换行符和空白符。

Go语言

使用反引号定义:

multiline := `This is
a multiline
string in Go.`

Python

使用三引号定义:

multiline = """This is
a multiline
string in Python."""

C语言

C语言没有内置多行字符串支持,需要通过拼接实现:

char multiline[] = "This is\n"
                  "a multiline\n"
                  "string in C.";

字符串索引与切片

Go语言

在Go中,字符串本质上是一个字节切片。你可以通过索引访问字符串的某个字节,但不能通过索引修改字符串。要处理Unicode字符,可以将字符串转换为[]rune(Unicode编码的字符切片)。

str := "Hello"
fmt.Println(str[0])  // 输出72,对应'H'的ASCII码

Python

支持字符串索引和切片:

str = "Hello"
print(str[0])  # 输出'H'
print(str[1:4])  # 输出'ell'

C语言

字符串是字符数组,可以使用索引访问:

char str[] = "Hello";
printf("%c", str[0]);  // 输出'H'

字符串比较

Go语言

Go中的字符串比较基于字节序列。可以使用==!=等运算符进行比较。

不同于C语言,Go字符串比较不需要显式地调用函数,操作简单直接。

使用 == 进行比较:

str1 := "Hello"
str2 := "Hello"
fmt.Println(str1 == str2)  // 输出true

Python

同样使用 ==

str1 = "Hello"
str2 = "Hello"
print(str1 == str2)  # 输出True

C语言

使用 strcmp() 进行比较:

#include <string.h>
char str1[] = "Hello";
char str2[] = "Hello";
printf("%d", strcmp(str1, str2));  // 输出0(相等)

总结:

  • 语法简洁性
    Go语言比C语言简洁,接近Python的风格,但更注重类型安全和编译时检查。

  • 不可变性
    Go和Python的字符串不可变,C语言的字符串是字符数组,可直接修改。

  • 多行字符串处理
    Go和Python提供原生支持(反引号与三引号),而C语言需要拼接实现。

  • 字符串操作效率
    Go在性能方面优于Python,尤其在处理大量文本时。C语言更接近底层控制,适合高性能要求。

我们在学习Go语言时,也可以结合Python和C语言的对比,这样可以更清楚地了解其设计理念,并帮助你更快地掌握编程核心概念。