golang 数字字面量语法
Go1.13 版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮 点数的格式定义数字,例如:
v := 0b00101101, 代表二进制的 101101,相当于十进制的 45。
v := 0o377,代表八进制的 377,相当于十进制的 255。
v := 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25。
而且还允许我们用 _ 来分隔数字,比如说: v := 123_456 等于 123456。
golang 逃逸技术分析
golang逃逸技术分析_escape( escapes to heap)optimizer details-CSDN博客
golang 字符串拼接
https://blog.csdn.net/Peerless__/article/details/133277418
golang len()函数功能
len函数功能是用于返回数组、切片、映射、字符串等类型的长度或元素个数。
具体功能取决于传递给len()函数的类型。
详细介绍:
1、对于数组和切片,len()函数返回数组或切片的元素个数;
2、对于映射,len()函数返回映射中键值对的数量;
3、对于字符串,len()函数返回字符串的字节数(即字符串中的字符数)。
golang unsafe.Sizeof() 对字符(rune)处理
在Go语言中,
unsafe.Sizeof
函数用于获取变量在内存中的大小(以字节为单位)。对于字符(在Go中通常是rune
或byte
类型),unsafe.Sizeof
将返回该字符类型所占用的内存大小。对于
byte
类型,它是一个8位的数据类型,因此unsafe.Sizeof(byte)
将返回1,因为一个字节在内存中占用一个字节的大小。对于
rune
类型,它通常用于表示Unicode字符,其大小取决于底层平台的实现。在大多数平台上,rune
是32位的,因此unsafe.Sizeof(rune)
将返回4,因为它占用4个字节的内存。对于字符串string类型,都是16字节 聊聊Go语言中的字符串-CSDN博客
需要注意的是,
unsafe.Sizeof
主要用于低级内存操作和反射等高级用法,通常不建议在常规编程中频繁使用。它提供了对底层内存布局的直接访问,因此需要谨慎使用,以避免潜在的安全问题和性能问题。
golang byte和rune类型
组成每个字符串的元素叫做“字符”,可以通过遍历字符串元素获得字符。 字符用单引号(’) 包裹起来。一个汉字占用 3 个字节 一个字母占用一个字节
Go 语言的字符有uint8和rune两种
- uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
- rune 类型,代表一个 UTF-8 字符。
当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型实际是一个 int32。 Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可 以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。
因为 UTF8 编码下一个中文汉字由 3 个字节组成,所以我们不能简单的按照字节去遍历一个 包含中文的字符串,否则就会出现上面输出中第一行的结果。 字符串底层是一个 byte 数组,所以可以和[]byte 类型相互转换。字符串是不能修改的,字符串是由 byte 字节组成,所以字符串的长度是 byte 字节的长度。 rune 类型用来表示 utf8 字 符,一个 rune 字符由一个或多个 byte 组成。
rune 类型实际是一个 int32
修改字符串
要修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为 string。无论哪种转换, 都会重新分配内存,并复制字节数组
注意:非纯ascii码组成的字符串转 []byte 再转字符串会乱码
func changeString() {
s1 := "big"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1)) //pig
s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2)) //红萝卜
}
golang 取余
package main
import (
"fmt"
)
func main() {
fmt.Println("10+3=", 10+3) // =13
fmt.Println("10-3=", 10-3) // =7
fmt.Println("10*3=", 10*3) // =30
//除法注意:如果运算的数都是整数,那么除后,去掉小数部分,保留整数部分
fmt.Println("10/3=", 10/3) //3
fmt.Println("10.0/3=", 10.0/3) //3.3333333333333335
// 取余注意 余数=被除数-(被除数/除数)*除数
fmt.Println("10%3=", 10%3) // =1
fmt.Println("-10%3=", -10%3) // -1
fmt.Println("10%-3=", 10%-3) // =1
fmt.Println("-10%-3=", -10%-3) // =-1
}
switch语法
一个分支可以有多个值,多个 case 值中间使用英文逗号分隔
写法一:
n := 2
switch n {
case 1, 3, 5, 7, 9:
fmt.Println("奇数")
case 2, 4, 6, 8:
fmt.Println("偶数")
default:
fmt.Println(n)
}
写法二:
switch n := 7; n {
case 1, 3, 5, 7, 9:
fmt.Println("奇数")
case 2, 4, 6, 8:
fmt.Println("偶数")
default:
fmt.Println(n)
}
注意: 上面两种写法的作用域
switch 的穿透 fallthrought
fallthrough语法可以执行满足条件的 case 的下一个 case,是为了兼容 C 语言中的 case 设计 的
func switchDemo5() {
s := "a"
switch {
case s == "a":
fmt.Println("a")
fallthrough
case s == "b":
fmt.Println("b")
case s == "c":
fmt.Println("c")
default:
fmt.Println("...")
}
}
/*
输出:
a
b
*/
fallthrough默认只能穿透一层
var num int = 10
switch num {
case 10:
fmt.Println("ok1")
fallthrough //默认只能穿透一层
case 20:
fmt.Println("ok2")
fallthrough
case 30:
fmt.Println("ok3")
default:
fmt.Println("没有匹配到..")
}
/*
输出:
ok1
ok2
ok3
*/
golang 数组
在 Golang 中数组是一个长度固定的数 据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型。