range
在Go语言中,range关键字用于遍历数组、切片、字符串、map和通道等数据结构。range语法的语法如下:
for index, value := range expression {
// 循环体语句
}
s := "Hello, World!"
for i, c := range s {
fmt.Printf("字符 %d 是 %c\n", i, c)
}
其中,expression表示一个数组、切片、字符串、map或通道等数据结构,index表示当前迭代的元素的索引或键,value表示当前迭代的元素的值
m := map[string]int{"one": 1, "two": 2, "three": 3}
for k, v := range m {
fmt.Printf("%s:%d\n", k, v)
}
在这个例子中,我们使用range语法遍历mapm中的所有键值对。
在每次迭代中,range语法会返回当前键k和值v。我们可以使用Printf()函数打印出当前键和值。
函数
变量类型是后置的
func add(x int, y int) int {
return x + y
}
func add2(x,y int) int{
return x + y
}
返回两种类型:
在这个例子中,我们定义了一个整数切片nums,然后调用函数exist,并传递了切片和整数参数5。函数会查找整数5在切片中的位置,并返回位置和true。最终,我们可以根据返回值判断数字5是否在切片中,以及其在切片中的位置。如果存在,我们将会输出数字5在切片中的位置;如果不存在,我们将会输出数字5不在切片中。
需要注意的是,函数的返回值是一个有序对(int, bool),其中第一个元素表示位置,第二个元素表示是否存在。如果存在,则第二个元素为true,否则为false。
func exist(nums []int, target int) (int, bool) {
for i, num := range nums {
if num == target {
return i, true
}
}
return -1, false
}
指针
在Go语言中,函数参数默认是值传递。这意味着函数会复制参数的值,然后在函数内部使用副本。如果我们想修改函数外部的变量,我们需要使用指针传递,即将变量的地址传递给函数,并在函数内部使用指针进行操作。例如,以下代码定义了一个函数swap,它接受两个整数指针,并交换它们的值:
func swap(x *int, y *int) {
temp := *x
*x = *y
*y = temp
}
调用:
a := 1
b := 2
swap(&a, &b) //传递的是a,b的地址
fmt.Println(a, b) // 输出 2 1
结构体
在Go语言中,我们使用type关键字来定义结构体类型,并使用struct关键字来定义结构体的字段。例如,以下代码定义了一个名为Person的结构体,它包含了一个字符串类型的name字段和一个整数类型的age字段:
type Person struct {
name string
age int
}
var p Person
p.name = "Alice"
p.age = 30
var ptr *Person = &p
fmt.Println(ptr.name, ptr.age)
nil表示空指针,如果没找到可以返回 nil,errors.New("not found")
import "errors"
func divide(x int, y int) (int, error) {
if y == 0 {
return 0, errors.New("division by zero")
}
return x / y, nil
}
格式化输出
在Go语言中,fmt包中的Printf函数可以用于格式化输出文本。Printf函数接受一个格式化字符串和一系列参数,并将格式化后的字符串输出到标准输出或指定的输出流中。格式化字符串中包含占位符,用于指定参数的类型、宽度、精度等信息。
以下是一些常用的Printf格式化占位符:
%v:用于打印变量的值,可以打印任意类型的值。%d:用于打印有符号整数,例如int、int32、int64等类型。%f:用于打印浮点数,例如float32、float64等类型。%s:用于打印字符串。%t:用于打印布尔值。%p:用于打印指针的地址。
在Printf函数中,还可以使用一些标志来控制格式化输出的行为。以下是一些常用的Printf标志:
+v:在%v的基础上,对结构体和数组等复合类型的字段名进行展开打印。#v:在%v的基础上,对字符串使用Go语法格式化输出。例如,字符串中的双引号将被转义为转义符号,非ASCII字符将被转义为\uXXXX格式。
type Person struct {
Name string
Age int
}
func main() {
p := Person{"Alice", 30}
fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
fmt.Printf("Person: %+v\n", p)
fmt.Printf("Person: %#v\n", p)
}
Output:
Name: Alice, Age: 30
Person: {Name:Alice Age:30}
Person: main.Person{Name:"Alice", Age:30}