在 Golang 中,判断字符串的最后一个字符有几种方法,具体取决于你想要如何处理和访问这个字符。
方法一:使用字符串切片(推荐)
这是最常见也是最简洁的方法。你可以通过索引来访问字符串的最后一个字符。go
package main
import "fmt"
func main() {
str1 := "Hello"
str2 := "Golang"
str3 := "" // 空字符串
// 检查字符串是否为空
if len(str1) > 0 {
lastChar := str1[len(str1)-1]
fmt.Printf("'%s' 的最后一个字符是: %c\n", str1, lastChar) // %c 用于打印字符
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个字符。\n", str1)
}
if len(str2) > 0 {
lastChar := str2[len(str2)-1]
fmt.Printf("'%s' 的最后一个字符是: %c\n", str2, lastChar)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个字符。\n", str2)
}
if len(str3) > 0 {
lastChar := str3[len(str3)-1]
fmt.Printf("'%s' 的最后一个字符是: %c\n", str3, lastChar)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个字符。\n", str3)
}
}
解释:
* len(str): 获取字符串的长度。
* str[index]: Golang 中的字符串是字节序列,所以 str[index] 会返回该索引位置的字节(一个 uint8 类型的值)。
* len(str) - 1: 索引是从 0 开始的,所以最后一个字符的索引是长度减一。
* 重要: 在访问 str[len(str)-1] 之前,一定要检查字符串是否为空 (len(str) > 0)。如果字符串为空,len(str)-1 会是 -1,访问 -1 索引会 panic(运行时错误)。
* %c: fmt.Printf 的格式化动词,用于将一个整数(字节)按照 ASCII 码解析成字符打印出来。
方法二:使用 utf8.DecodeLastRuneInString (处理 Unicode 字符)
如果你的字符串可能包含多字节的 Unicode 字符(如中文、日文、表情符号等),那么直接通过字节索引访问最后一个字符可能并不准确,因为它只返回最后一个字节。为了正确获取最后一个 Unicode 字符(rune),你应该使用 unicode/utf8 包。go
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str1 := "Hello"
str2 := "你好" // 中文字符
str3 := "👋" // 表情符号
str4 := "" // 空字符串
// 检查字符串是否为空
if len(str1) > 0 {
lastRune, _ := utf8.DecodeLastRuneInString(str1) // 第二个返回值是 rune 的大小,我们不需要
fmt.Printf("'%s' 的最后一个 Rune 是: %c\n", str1, lastRune)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个 Rune。\n", str1)
}
if len(str2) > 0 {
lastRune, _ := utf8.DecodeLastRuneInString(str2)
fmt.Printf("'%s' 的最后一个 Rune 是: %c\n", str2, lastRune)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个 Rune。\n", str2)
}
if len(str3) > 0 {
lastRune, _ := utf8.DecodeLastRuneInString(str3)
fmt.Printf("'%s' 的最后一个 Rune 是: %c\n", str3, lastRune)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个 Rune。\n", str3)
}
if len(str4) > 0 {
lastRune, _ := utf8.DecodeLastRuneInString(str4)
fmt.Printf("'%s' 的最后一个 Rune 是: %c\n", str4, lastRune)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个 Rune。\n", str4)
}
}
解释:
* utf8.DecodeLastRuneInString(str): 这个函数会从字符串的末尾开始解码一个 UTF-8 编码的 Rune。它返回两个值:
* 第一个是解码出的 Rune(类型是 rune,int32 的别名)。
* 第二个是该 Rune 所占用的字节数。
* 同样,在使用之前也需要检查字符串是否为空。如果为空,DecodeLastRuneInString 会返回 utf8.RuneError (值为 \uFFFD) 和 0。
方法三:转换为 rune 切片 (适用于需要多次访问或处理 rune)
如果你需要对字符串中的 rune 进行更复杂的操作,可以先将其转换为 rune 切片。go
package main
import "fmt"
func main() {
str1 := "Hello"
str2 := "你好"
str3 := ""
runes1 := []rune(str1)
if len(runes1) > 0 {
lastRune := runes1[len(runes1)-1]
fmt.Printf("'%s' 的最后一个 Rune 是: %c\n", str1, lastRune)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个 Rune。\n", str1)
}
runes2 := []rune(str2)
if len(runes2) > 0 {
lastRune := runes2[len(runes2)-1]
fmt.Printf("'%s' 的最后一个 Rune 是: %c\n", str2, lastRune)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个 Rune。\n", str2)
}
runes3 := []rune(str3)
if len(runes3) > 0 {
lastRune := runes3[len(runes3)-1]
fmt.Printf("'%s' 的最后一个 Rune 是: %c\n", str3, lastRune)
} else {
fmt.Printf("'%s' 是空字符串,没有最后一个 Rune。\n", str3)
}
}
解释:
* []rune(str): 将字符串 str 转换为一个 rune 切片。每个 rune 代表一个 Unicode 码点。
* 然后就可以像访问普通切片一样访问最后一个 rune。
总结:
* 最简单(ASCII 或字节): str[len(str)-1],务必检查非空。
* 最安全(Unicode): utf8.DecodeLastRuneInString(str),务必检查非空。
* 方便操作(Unicode): []rune(str)[len(runes)-1],务必检查非空。
在大多数情况下,如果你不确定字符串是否包含多字节字符,使用 utf8.DecodeLastRuneInString 是更稳妥的选择。如果你的字符串只包含 ASCII 字符,那么第一种方法是最快的。