| 类型名称 | 类型和描述 |
|---|---|
| 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 mainimport ("fmt")func main() {// 修改字符串中的字节s := "Hello 世界!"b := []byte(s) // 转换为 []byte,自动复制数据b[5] = ',' // 修改[]bytefmt.Printf("s: %s\n", s) //Hello 世界!s不能被修改,内容保持不变fmt.Printf("b: %s\n", b) //Hello,世界!修改后的数据// 修改字符串中的字符r := []rune(s) // 转换为 []rune,自动复制数据r[6] = '中' // 修改 []runer[7] = '国' // 修改 []runefmt.Printf("s: %v\n", s) // s: Hello 世界!s不能被修改,内容保持不变fmt.Println(string(r)) // Hello 中国!转换为字符串,又一次复制数据}
strings包
package mainimport ("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 stringfmt.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 mainimport ("fmt""strconv")func main() {orig := "233"fmt.Printf("%T %d\n", orig, strconv.IntSize) //string 64 字符串类型,大小64num, _ := strconv.Atoi(orig) // num, _ := strconv.Atoi(orig) string > intfmt.Printf("num: %v\n", num) // num: 233num += 5newS := strconv.Itoa(num) // 十进制数字 > stringfmt.Printf("newS: %v\n", newS) // newS: 238a, _ := strconv.ParseFloat(orig, 32) // string > float32fmt.Printf("a: %v\n", a) // a: 233b, _ := strconv.ParseFloat(orig, 64) // string > float64fmt.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 | 输出值的类型 |
