
值传递 引用类型传递变量作用域
局部变量 全局变量 for if 代码块
赋值语句不能在函数外执行。但是可以出初始化
var age int =20 对的 Name :="jack"。不对Go 字符串函数详解
系统函数
len :是按照字符串的长度 字节返回 一个汉字三个字节。
字符串中有中文 转为[]rune 不会乱码
strconv Atoi
var ss = "今天真好 goupi"
runes := []rune(ss)
for i := 0; i < len(runes); i++ {
fmt.Printf("字符串%cn", runes[i])
}
n, err := strconv.Atoi("12")
str := strconv.Itoa(12312)
fmt.Print("er", n, err)
fmt.Printf("str%s", str)
var bytes = []byte("hello summit")
fmt.Print(bytes)
str = string([]byte{97, 98, 99})
fmt.Println(str)
//10 进制转对应2 8 16
formatInt2 := strconv.FormatInt(123, 2)
formatInt8 := strconv.FormatInt(123, 8)
formatInt16 := strconv.FormatInt(123, 16)
fmt.Println(formatInt2, "x$s", formatInt8, "x$s", formatInt16)
contains := strings.Contains("seafooe", "sea")
fmt.Println(contains)
count := strings.Count("slellscclclsaa", "ads")
fmt.Println(count)
fold := strings.EqualFold("abc", "ABC")
//区分大小写
fmt.Println("abc" == "ABC")
//不区分大小写
fmt.Println(fold)
fmt.Println(strings.Index("alsl", "ls"))
fmt.Println(strings.LastIndex("alslwodsls", "ls"))
fmt.Println(strings.Replace("llosl", "l", "ls", 2)) //返回一个新的字符串原串并没有发生变化 -1 代表替换所有。
fmt.Println(strings.Split("l,ls,e,sl,ses", ",")) //得到一个新的 本身不会改变
fmt.Println(strings.ToLower("goLang"))
//去除左右空格 返回新的字符串 原字符串没变化
fmt.Println(strings.TrimSpace(" 1losl - asa "))
fmt.Println(strings.Trim("! sllwepsl !$$"," !$")) //strings.TrimLeft() TrimRight
//HasPrefix HasSuffix
fmt.Println(strings.HasPrefix("ftp://1012","ftp"))
fmt.Println(strings.HasSuffix("ftp://102/2/1.11","11"))
时间相关函数
now := time.Now()
fmt.Printf("%v,%T", now, now)
fmt.Println(now.Day(), now.Month(), now.Second())
fmt.Printf("%v", now.Year())
fmt.Println("unix", time.Now().Unix(), "unixnano", time.Now().UnixNano())
// 2006/01/02 15:04:05 数字是固定的可以组合
fmt.Println(now.Format("2006/01/02 15:04:05"))
// 时间常量 休眠
time.Sleep(time.Second * 10)
fmt.Println("wait 10 s") //不能用小数 比如 秒/1000 毫秒
i := 0
for {
i++
fmt.Println(i)
time.Sleep(time.Millisecond * 100)
if i == 100 {
break
}
}
Golang 内置函数
len new make
make 和 new 都是用来分配内存。
num2 :=new(int)
fmt.Printf("num2的类型是%T,值是%v,地址是%v,指向的值%v",num2,num2,&num2,*num2)
//num2的类型是*int,值是0xc00008c138,地址是0xc000090008
make主要是个引用类型分配:
slice map chan
Golang处理方式 defer panic recover Go中抛出一个panic异常 然后再defer 中 通过recover 捕获这异常然后正常处理。 内部匿名函数 自定义错误 errors.New("错误说明“) 会返回一个error 类型 表示一个错误 panic 可以接收一个空接口类型 任何值都可以传入。数组
fmt.Sprinf 格式化输出。
数组
数组是值类型 值类型和值传递的问题。 数组内存布局 数组间元素的间隔取决于数组的值的类型。 for range 遍历 第一个返回值 index 是数组下标 第二个value值是该下标位置的值 他们都是仅在for循环内部可见的局部变量 遍历数组时 如果不想使用下标 index 可以直接把下标置为下划线_ index 名称不固定可以自定义。 var arr[] int 此时 是一个切片 slice 切片。 函数内修改数组 不会真正改变 原数组的值。 想要修改原数组 :只能采用传指针的方式。 Go中 长度是 数组类型的一部分 比如参数是长度为3 的数组 那必须传入长度为3的数组。 数组的反转slice 切片
对于slice len cap cap 一般是len的两倍 切片的内存布局 slice 从底层来说 是一个数据结构体 使用切片的三种方式 切片去引用一个已经创建好的数组 make的方式来创建切片 切片make后才可以使用。 make形式创建的切片对应的数组是由make底层维护 对外不可见 切片的遍历 for常规 for range 结构遍历切片
2022-02-01----
修改slice 的值 原值也会发生变化。 切片append 回创建新的底层数组。新的底层数组是底层维护。 在函数内修改 slice 会改变原数组。 string 和slice string本身是不可变的。 如果需要修改 字符串 则先将 string---> []byte / 或者 []rune--> 修改--> 重写转成string
var strSlice []string = []string{"tom", "kac", "jkqun", "siwbini"}
fmt.Println(strSlice, len(strSlice), cap(strSlice))
var slice2 []int = []int{90, 78, 29, 39} //切片
fmt.Println(slice2, "slice2")
slice2 = append(slice2, 100)
//切片上追加切片
slice2 = append(slice2, slice2...)
fmt.Println(slice2, "slice2")
var slice3 = make([]int, 13)
// 把slice2 拷贝到 slice3 两个都是切片才可以copy
// 两个切片是独立的空间 修改一个另外一个不变 不会同步变化
// slice3 长度小于slice2 只截取一定长度。
copy(slice3, slice2)
fmt.Println(slice3)
slice4 := "hello sina mora si wa huis"
arr := []byte(slice4)
arr[1] = 'z'
slice4 = string(arr)
fmt.Println(slice4)
// 如果有汉字就会出现乱码 string 转成rune[] 是按照字符计算
slice5 := "夜深忽梦少年事1002"
arr1 := []rune(slice5)
arr1[0] = '被'
str2 := string(arr1)
fmt.Println(str2)
二维数组
二维数组的使用和内存布局 二维数组的遍历 双层for 循环 for-range 遍历Go -Map
var map 变量名 map[keytype]valuetype
slice map function 不可以做key 没办法用 == 来判断。
通常为int string
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)