golang 冷知识(持续补充)

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 逃逸的发生?

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中通常是runebyte类型),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两种

  1. uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
  2. 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 是两个不同的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值