值传递 引用类型传递变量作用域
局部变量 全局变量 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条)