类型名称 | 类型和描述 |
---|---|
int/uint | 无符号整型和带符号整型内存大小相等,具体大小取决于编译器实现。 int8、int16、int32(rune)、int64和uint8(byte)、uint16、uint32、uint64。 rune是int32的别称,byte是uint8的别称。 8位整型占1字节,16位整型占2字节,32位整型占4字节,64位整型占8字节。 |
float32/float64 | 长度分别为4字节8字节,float64为默认类型。 complex64、complex128为两个复数类型,其中 complex64类型带有float32实部和虚部,complex128类型带有float64实部和虚部 |
string | 默认使用UFT-8编码标识Unicode文本 |
boolean | true或者false,例如 var b bool = true 。类型长度为 1 字节 |
派生类型 | 切片类型slice 、字典map 、通道channel 、指针pointer 、数组array 、结构化struct 、函数function 、接口interface 、错误error 。它们内部结构复杂,不仅需要申请内存,还需要初始化相关属性 |
整型
浮点型
字符与字符串
连接字符串
加号连接字符串,由于编译器行尾自动补全分号,加号必须放在第一行
字符串遍历
func main() {
s := "我是中国人"
for i := 0; i < len(s); i++ {
fmt.Printf("%c", s[i]) // 乱码,因为一字节无法显示为一个完整的字符
}
for i := 0; i < len(s); i++ {
fmt.Printf("%d = %v\n", i, s[i]) // 输出单个字节值
}
fmt.Print("\n")
for _, v := range s {
fmt.Printf("%c", v) // 我是中国人
}
fmt.Print("\n")
}
字符串修改
package main
import (
"fmt"
)
func main() {
// 修改字符串中的字节
s := "Hello 世界!"
b := []byte(s) // 转换为 []byte,自动复制数据
b[5] = ',' // 修改[]byte
fmt.Printf("s: %s\n", s) //Hello 世界!s不能被修改,内容保持不变
fmt.Printf("b: %s\n", b) //Hello,世界!修改后的数据
// 修改字符串中的字符
r := []rune(s) // 转换为 []rune,自动复制数据
r[6] = '中' // 修改 []rune
r[7] = '国' // 修改 []rune
fmt.Printf("s: %v\n", s) // s: Hello 世界!s不能被修改,内容保持不变
fmt.Println(string(r)) // Hello 中国!转换为字符串,又一次复制数据
}
strings包
package main
import (
"fmt"
"strings"
"unicode/utf8"
)
func main() {
str := "This is an example of a string"
// 1. 包含
fmt.Printf("%t\n", strings.HasPrefix(str, "Th")) // 开头
fmt.Printf("%t\n", strings.HasSuffix(str, "string")) // 结尾
fmt.Printf("%t\n", strings.Contains(str, "example")) // 包含
// 2. 索引
fmt.Printf("%d\n", strings.Index(str, "of")) // 顺序第一个匹配字符的索引
fmt.Printf("%d\n", strings.LastIndex(str, "of")) // 逆序第一个匹配字符的索引
fmt.Printf("%d\n", strings.IndexRune(str, 'f')) // 如果是非ASCII编码的字符,用该函数对字符定位
// 3. 替换
fmt.Println(strings.Replace(str, "string", "int", 1)) // 第4个参数表示匹配到第几个,如果是-1,则代表匹配所有
// 4. 统计
fmt.Printf("%d\n", strings.Count(str, " ")) // 匹配空格出现的频率
fmt.Printf("%d\n", len([]rune(str))) // 统计字符串长度
fmt.Println(utf8.RuneCountInString(str)) // 统计字符串长度
// 统计字符串长度推荐第二种,但是如果只是单纯统计,没有用到utf8的其它函数,倒也没必要把这个utf8包引入
// 5. 大小写转换
fmt.Printf("%s\n", strings.ToLower(str)) // 转小写 this is an example of a string
fmt.Printf("%s\n", strings.ToUpper(str)) // 转大写 THIS IS AN EXAMPLE OF A STRING
// 6. 修剪
fmt.Printf("%q\n", strings.Trim("今天天气真好", "今天")) // "气真好" Trim函数会把第二个参数转为rune类型,进而逐一匹配替换,即“今天”被分为两个字符分别替换
fmt.Printf("%q\n", strings.TrimLeft("今天天气真好", "今天")) // "气真好"
fmt.Printf("%q\n", strings.Trim(" !!! Golang !!! ", "! ")) // "Golang"
fmt.Printf("%q\n", strings.Trim(" !!! Golang !!! ", " ! ")) // "Golang"
fmt.Printf("%q\n", strings.Trim(" !!! Golang !!! ", "!")) // " !!! Golang !!! "
fmt.Printf("%q\n", strings.TrimLeft(" !!! Golang !!! ", "! ")) // "Golang !!! "
fmt.Printf("%q\n", strings.TrimLeft(" !!! Golang !!! ", " ! ")) // "Golang !!! "
fmt.Printf("%q\n", strings.TrimLeft(" !!! Golang !!! ", "!")) // " !!! Golang !!! "
fmt.Printf("%q\n", strings.TrimSpace(" \t\n 这是\t一句话 \n\t\r\n\v ")) // "这是\t一句话" 修剪掉两侧水平制表符\t、垂直制表符\v、换行\n、回车\r
// 7. 分割
fmt.Printf("%q\n", strings.Split("a,b,c", ",")) // ["a" "b" "c"]
fmt.Printf("%q\n", strings.Split("a boy a girl a dog a cat", "a ")) // ["" "boy " "girl " "dog " "cat"]
fmt.Printf("%q\n", strings.Split("xyz", "")) // ["x" "y" "z"]
// 8. 插入字符
str = "The quick brown fox jumps over the lazy dog 中文"
strSli := strings.Fields(str)
fmt.Printf("%s\n", strSli) // [The quick brown fox jumps over the lazy dog 中文]
for _, val := range strSli {
fmt.Printf("%s ", val) // The quick brown fox jumps over the lazy dog 中文
}
fmt.Println()
str2 := strings.Join(strSli, ";")
fmt.Printf("%s\n", str2) // The;quick;brown;fox;jumps;over;the;lazy;dog;中文
// bytes.Buffer 也可以连接字符
}
strconv包
用于string和其它类型之间的转换
package main
import (
"fmt"
"strconv"
)
func main() {
orig := "233"
fmt.Printf("%T %d\n", orig, strconv.IntSize) //string 64 字符串类型,大小64
num, _ := strconv.Atoi(orig) // num, _ := strconv.Atoi(orig) string > int
fmt.Printf("num: %v\n", num) // num: 233
num += 5
newS := strconv.Itoa(num) // 十进制数字 > string
fmt.Printf("newS: %v\n", newS) // newS: 238
a, _ := strconv.ParseFloat(orig, 32) // string > float32
fmt.Printf("a: %v\n", a) // a: 233
b, _ := strconv.ParseFloat(orig, 64) // string > float64
fmt.Printf("b: %v\n", b) // b: 233
}
字符串格式化
格式化指令 | 含义 |
---|---|
%% | %字面量 |
%b | 一个二进制整数,将一个整数格式化为二进制的表达方式 |
%c | 一个Unicode字符 |
%d | 十进制数值 |
%0 | 八进制整数 |
%x | 小写的十六进制数 |
%X | 大写的十六进制数 |
%U | 一个Unicode表示法表示的整型码值,默认是4个数字字符 |
%s | 输出以原生的UTF-8字节表示的字符,如果console不支持UTF-8编码,则乱码 |
%t | 以true或false的方式输出布尔值 |
%v | 使用默认格式输出值,或者如果方法存在,则使用类型的String()方法输出的自定义值 |
%T | 输出值的类型 |