go 数据处理
关于 map
-
变量名以小写开头不公开,其他包可以间接调用,一个函数可以返回一个未公开类型的值 未公开标识符 定义类型,小写开头为未公开标识符 文件夹应该同包名相同 当需要调用未公开标识符时,可以创建一个工厂函数 New 来返回该未公开标识符
-
map 需要先用 make 构造,否则会报错,因为 map 变量默认零值 nil
go 打印中文出现乱码
普通 println 打印字符串显示正常,遍历字符串乱码,因为传统字符串遍历按字节遍历,而一个汉字占 3 个字节
|
|
方法一 使用 rune 切片可以
|
|
方法二 使用 range,会跳过 3 个 index 打印字
|
|
main 展开代码
|
|
URI
url 编码会把保留字符转换成在 ASCII 中对应得字节值 byte,接着表示为两位长的十六进制数字,并在前面加上百分号
泛型
func SumInts(m map[string]int64) int64
SumFloats 将 string 映射为 float64 值
泛型函数
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V
简化为
func SumNumbers[K comparable, V Number](m map[K]V) V
comparable 的约束在 Go 中预先声明。它允许其值可用作比较运算符== 和!= 的操作数的任何类型。Go 要求映射键具有可比性。因此,将 K 声明为 comparable 是必要的,以便您可以使用 K 作为映射变量中的键。它还确保调用代码对映射键使用允许的类型 Go 要求映射键具有可比性。因此,将 K 声明为 comparable 是必要的,以便您可以使用 K 作为映射变量中的键。它还确保调用代码对映射键使用允许的类型 指定 m 参数的类型为 map[K]V 类型,其中 K 和 V 是已为类型参数指定的类型。请注意,我们知道 map[K]V 是有效的映射类型,因为 K 是可比较的类型。如果我们没有声明 K 具有可比性,编译器将拒绝对 map[K]V 的引用
SumIntsOrFloats[string, int64](ints)
简化为
SumIntsOrFloats(ints)
断言
将接口与结构体连接并赋予类型,再判断是否正确
|
|
interface
|
|
如果没有将 interface 给 new 成 struct 则会报错
|
|
new 和 make 的区别 new 分配内存,只有一个参数,int, 数组,结构体,甚至函数类型都可以是 new 的参数,返回的是指针 make 分配和初始化内存,只能用于 slice, map 和 chan 这 3 个类型,返回的是原始类型
map 如果是 nil,是不能往 map 插入元素的,插入元素会引发 panic chan 如果是 nil,往 chan 发送数据或者从 chan 接收数据都会阻塞 slice 会有点特殊,理论上 slice 如果是 nil,也是没法用的。但是 append 函数处理了 nil slice 的情况,可以调用 append 函数对 nil slice 做扩容。但是我们使用 slice,总是会希望可以自定义长度或者容量,这个时候就需要用到 make。
make 可以开辟新空间,规定 len 和 cap new 虽然也可以初始化,但只能得到 nil
go 数组与切片
- 数组一旦定义长度无法改变长度,所以一般不定义长度使用切片
- 切片添加元素时,"…“代表添加的不止一个元素
二维数组添加元素
|
|
不改变原来数组的内存
ans = append(ans, append([]int(nil), nums...))(正确写法)
需要注意的是,为了避免对原切片造成影响,代码在将当前排列追加到结果数组 ans 时,使用了 append(ans, append([]int(nil), nums…)) 的方式创建了一个新的切片,保证了 nums 切片和新切片不共享内存
小数点处理
github.com/shopspring/decimal
fmt.Println(decimal.NewFromFloat(5.0 / 2.0).Round(0).Float64())
切片
make(类型,长度,容量) var 声明全局,:=声明局部
字符串注意事项
-
单引号用来表示单个字符串,c 语言中的 char
-
双引号代表字符串
-
反引号忽略转义字符
-
rune 用来转化为 int32 位,表示 ascii 码
byte 代表 UTF-8 字符串的 1 个字节的值,表示一个 ASCII 码字符,utf-8 中一个中文占三个字节 rune(实际上是 int32),代表单个 Unicode 字符 4 个字节,常用来处理 unicode 或 utf-8 字符(一切字符) Go 语言的 string 是用 uft-8 进行编码的,英文字母占用一个字节,而中文字母占用 3 个字节 %q 解释型字符串,反引号可以不写换行符(因为没法写)来表示一个多行的字符串
- 字符格式化输出 fmt.Print
小数点和替换
保留两位小数
strconv.Sprintf
value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.824), 64) fmt.Println(value) //9.82
“github.com/shopspring/decimal” v1, _ := decimal.NewFromFloat(9.824).Round(2).Float64()
Strings 包 func Repeat(s string, k int) string func Replace(s, old, new string, n int) string