go字符串操作、格式化输出、JSON处理与类型转换概述

327 阅读6分钟

字符串操作

  1. Contains(s, substr string) bool:判断字符串 s 是否包含子串 substr,返回布尔值。
contains := strings.Contains("Hello, World!""World")// true
  1. Count(s, substr string) int:计算子串 substr 在字符串 s 中出现的次数,返回整数。
count := strings.Count("Hello, World!""l")// 3
  1. Index(s, substr string) int:查找子串 substr 在字符串 s 中首次出现的位置,返回索引值。如果未找到,返回 -1。
index := strings.Index("Hello, World!""World")// 7
  1. Join(a []string, sep string) string:将字符串切片 a 中的所有字符串使用分隔符 sep 进行连接,返回连接后的字符串。
join := strings.Join([]string{"Hello", "World!"},", ")// Hello, World!
  1. Repeat(s string, count int) string:将字符串 s 重复 count 次,返回重复后的字符串。
repeat := strings.Repeat("Hello, World!"3)// Hello, World!Hello, World!Hello, World!
  1. Replace(s, old, new string, n int) string:将字符串 s 中的前 n 个非重叠的子串 old 替换为字符串 new,返回替换后的字符串。
replace := strings.Replace("Hello, World!""l""x"2)// Hexxo, World!
  1. Split(s, sep string) []string:将字符串 s 按照分隔符 sep 进行分割,返回子串的切片。
split := strings.Split("Hello, World!"", ")// [Hello World!]
  1. Trim(s string, cutset string) string:在字符串 s 的头部和尾部去除字符串 cutset 中包含的所有字符,返回处理后的字符串。
trim := strings.Trim(" Hello, World! "" ")// Hello, World!
  1. Fields(s string) []string:去除字符串 s 的空格符,并且按照空格分割返回切片,它等价于 Split(s, " ")
fields := strings.Fields(" Hello, World! ")// [Hello, World!]
  1. HasPrefix(s, prefix string) bool:判断字符串 s 是否以 prefix 开头。
hasPrefix := strings.HasPrefix("Hello, World!""Hello")// true
  1. HasSuffix(s, suffix string) bool:判断字符串 s 是否以 suffix 结尾。

  2. ToLower(s string) string:将字符串 s 转换为小写。

toLower := strings.ToLower("Hello, World!")// hello, world!
  1. ToUpper(s string) string:将字符串 s 转换为大写。

  2. TrimSpace(s string) string:去除字符串 s 开头和结尾的空白符号。

trimSpace := strings.TrimSpace(" Hello, World! ")// Hello, World!
  1. TrimLeft(s string, cutset string) string:在字符串 s 左侧去除字符串 cutset 中包含的所有字符。

  2. TrimRight(s string, cutset string) string:在字符串 s 右侧去除字符串 cutset 中包含的所有字符。

  3. TrimPrefix(s, prefix string) string:去除字符串 s 的前缀 prefix

  4. TrimSuffix(s, suffix string) string:去除字符串 s 的后缀 suffix

fmt格式化

Printf(format string, a ...interface{}):类似于 C 语言中的 printf 函数,根据指定的格式字符串 format 将可变参数 a ...interface{} 中的值格式化并打印到标准输出。

  1. %v:这是格式化字符串中的占位符,可以用来打印任意类型的变量的默认格式。例如,fmt.Printf("value: %v\n", variable) 将以默认格式打印变量 variable 的值。
count := 10
fmt.Printf("Count: %v\n", count) // 输出: Count: 10
  1. %+v:在 %v 的基础上,使用更详细的格式打印结构体,包括字段名。这对于调试和查看结构体的详细信息很有用。
type Person struct {
    Name string
    Age  int
}
// 打印结构体的详细信息
	person := Person{Name: "Alice", Age: 25}
	fmt.Printf("Person: %+v\n", person) // 输出: Person: {Name:Alice Age:25}
  1. %#v:在 %v 的基础上,打印出更详细的格式,包括类型信息。这对于查看变量的类型和值很有帮助。
// 打印变量的类型和值
	fmt.Printf("Variable: %#v\n", person) // 输出: Variable: main.Person{Name:"Alice", Age:25}

除了上述方法之外,还有其他一些常用的字符串格式化相关的方法,如:

  • Sprintf(format string, a ...interface{}) string:将格式化后的字符串作为结果返回,而不是打印到标准输出。
// 使用 Sprintf 将格式化的字符串赋值给变量
    formattedString := fmt.Sprintf("Person: %v, Age: %v", person.Name, person.Age)
    fmt.Println(formattedString) // 输出: Person: Alice, Age: 25
  • Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error):将格式化后的字符串写入指定的 io.Writer 接口实现中,而不是打印到标准输出。
// 将格式化后的字符串写入文件或其他 io.Writer
    file, _ := os.Create("output.txt")
    defer file.Close()
    fmt.Fprintf(file, "Person: %+v", person)
  • Errorf(format string, a ...interface{}) error:返回一个格式化后的错误字符串作为错误类型的值。
// 格式化错误字符串作为错误类型的值
    err := fmt.Errorf("Something went wrong: %v", person)
    fmt.Println(err) // 输出: Something went wrong: {Name:Alice Age:25}

JSON处理

JSON 操作非常简单。可以通过结构体的字段命名规则和标签来控制 JSON 序列化和反序列化的行为。

  1. 结构体字段的命名:要让结构体的字段能够被 JSON 序列化和反序列化,注意字段的第一个字母要大写

  2. JSON 序列化:使用 json.Marshal 函数可以将结构体序列化为 JSON 格式的字符串。Go 会根据字段名自动将结构体字段转换为对应的 JSON 键,并按照字段顺序生成 JSON 字符串。

  3. JSON 反序列化:使用 json.Unmarshal 函数可以将 JSON 字符串反序列化为结构体。Go 语言会根据字段名自动将 JSON 键转换为对应的结构体字段,并进行赋值。

  4. 修改输出字段名:可以使用结构体字段的标签(Tag)来修改 JSON 序列化后的字段名。通过在字段的后方添加 json:"tagname" 的格式,可以指定自定义的 JSON 键名。标签也可以包括其他选项,如忽略字段或指定字段序列化的其他规则。

  5. 举个栗子:

type Person struct {
	Name      string `json:"name"`
	Age       int    `json:"age"`
	Email     string `json:"email,omitempty"` // 忽略空字段
	IsStudent bool   `json:"is_student"`
}

func main() {
	// JSON 序列化
	person := Person{Name: "Alice", Age: 25, IsStudent: true}
	jsonData, _ := json.Marshal(person)
	fmt.Println(string(jsonData)) // 输出: {"name":"Alice","age":25,"is_student":true}

	// JSON 反序列化
	var newPerson Person
	json.Unmarshal(jsonData, &newPerson)
	fmt.Println(newPerson) // 输出: {Alice 25  false}
}

在示例中,我们定义一个 Person 结构体,其中的字段都是公开的(首字母大写)。通过在字段后方添加 json:"tagname" 标签,我们可以修改 JSON 序列化后的字段名。例如,Name 字段的标签为 json:"name",这样在 JSON 序列化时就会使用 "name" 作为键名。

另外,在 Email 字段的标签中添加了 omitempty 选项。这意味着如果该字段为空,则在 JSON 序列化时将忽略该字段。

类型转换

在 Go 语言中,不能直接像 C 语言那样使用 (int), (float) 等强制类型转换操作符来进行类型转换。Go 语言中的类型转换需要使用 strconv 包提供的函数进行转换。

下面是一些常用的类型转换函数:

  1. Atoi(s string) (int, error):将字符串转换为 int 类型。如果转换失败,会返回错误信息。
num, _ := strconv.Atoi("123")// 123
  1. Itoa(i int) string:将 int 类型转换为字符串。
str := strconv.Itoa(123)// 输出: "123"
  1. ParseBool(str string) (bool, error):将字符串转换为 bool 类型。支持解析 "true"、"false"、"1"、"0",不区分大小写
b, _ := strconv.ParseBool("true")// true
  1. ParseInt(s string, base int, bitSize int) (int64, error):将字符串转换为指定进制的整数值。base 表示进制,bitSize 表示结果的位大小(例如 0、8、16、32 或 64)。
num, _ := strconv.ParseInt("123", 10, 64)// 123
  1. ParseFloat(s string, bitSize int) (float64, error):将字符串转换为浮点数。bitSize 表示结果的位大小(32 或 64)。
num, _ := strconv.ParseFloat("123.456", 64)// 123.456

此外,还有切片类型也可以和字符串类型相互转换。

// 将字符串转换为字节切片
    bytes := []byte("Hello, World!")
    fmt.Println(bytes) // 输出: [72 101 108 108 111 44 32 87 111 114 108 100 33]

    // 将字节切片转换为字符串
    str := string([]byte{72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33})
    fmt.Println(str) // 输出: Hello, World!