(5).遍历string 💥
Go中得到字符串是一个字节的切片,可以通过将其内容封装在""中来创建字符串,Go中的字符串是Unicode兼容的,并且是UTF-8编码,字符串是一些字节的集合。
默认打印的是ascll码对应的十进制,我们需要进行%c接收
字符串一旦被定义是不能被修改的,因为字符串里面的字节对应的是byte
第一种遍历方式
package main import "fmt" /* 打印一个9*9 */ func main() { str := "hello,jsxs" println(str) // 获取字符串的长度 len for i := 0; i < len(str); i++ { fmt.Printf("%c\t", str[i]) //如果我们输出的话,会直接走向ascll码的十进制;所以我们要对其进行格式转化。 } }
第二种遍历方式
package main import "fmt" /* 打印一个9*9 */ func main() { str := "hello,jsxs" println(str) // 获取字符串的长度 len for i := 0; i < len(str); i++ { fmt.Printf("%c\t", str[i]) //如果我们输出的话,会直接走向ascll码的十进制;所以我们要对其进行格式转化。 } print("\n") // 通过range进行遍历,第一个是index,第二个是值。 for _, v := range str { fmt.Printf("%c\t", v) } }
(八)、函数
1.什么是函数?
- 函数是基本的代码块,用于执行一个任务。
- Go语言最少有一个main函数
- 你可以通过函数来划分不同的功能,逻辑上每个函数执行的是指定的任务。
- 函数声明告诉了编译器函数的名称,返回类型和参数。
2.函数的声明和调用
func Name([变量名 变量类型]) [(返回类型)]{函数体}
- 有参无返回值
- 有参有返回值
- 无参无返回值
- 多参多返回值
package main func printInfo4(x int, y int) (int, int) { return x, y } func printInfo() { println("无参无返回值") } func printInfo2(msg string) { println(msg) } func printInfo3(msg string) string { return msg } func main() { printInfo() printInfo2("有参无返回") println(printInfo3("一个有参一个返回")) var ( a int b int ) a, b = printInfo4(1, 2) println("多个有参多个返回", a, b) }
3.函数的参数
(1).形式参数和实际参数
形参和实参一 一对应
package main // 两个数字比大小 // 形式参数: 用于接受外部传入过来的参数叫做形式参数 // 实际参数 传给形参的参数叫做实际参数 func max(x, y int) int { if x > y { return x } else { return y } } func main() { println(max(1, 2)) //实参 }
(2).可变参数
概念: 一个函数的参数类型是确定的,但参数的个数是不确定的,就可以使用可变参数。
func Name(变量名 ...变量类型)(返回类型){ 函数体 }
注意事项:
- 如果一个参数是可变擦书,同时还有其他的参数,可变参数要放在列表的最后
- 一个函数的参数列表最多只有一个可变参数
- 可变参数的值是一个数组,可以用for来遍历
package main // 可变参数 func getSum(nums ...int) int { //这里的参数nums 相当于一个数组。 sum := 0 for i := 0; i < len(nums); i++ { sum += nums[i] } return sum } func main() { println(getSum(1, 2, 3, 4)) //实参 }
(3).参数的传递
按照数据的存储特点来分:
- 值类型的数据: 操作的是数据本身 int、string、bool、float64、array…
- 引用类型的数据: 操作的是数据的地址 slice、map、chan
值传递
值传递: 形参改变,实参不变。 内存地址不一样,
package main import "fmt" func update(array2 [4]int) { fmt.Println(array2, "接受前的数据") array2[0] = 100 fmt.Println(array2, "改变后的数据") } func main() { // 值传递: 形参改变实参不变 var array [4]int = [4]int{1, 2, 3, 4} update(array) fmt.Println(array) }
引用传递
形参改变,实参也改变。内存地址一样
package main import "fmt" func main() { // 切片,可以扩容的数组 s1 := []int{1, 2, 3, 4} fmt.Printf("%p %d", s1, s1) update2(s1) fmt.Printf("%p %d", s1, s1) } func update2(s2 []int) { fmt.Println("传递前的参数", s2) s2[0] = 100 fmt.Println("传递后的参数", s2) }