Go语言语法| 青训营

98 阅读4分钟

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}