GO 基础

106 阅读2分钟

包的引入实践

项目目录列表

  1. go mod 的方式
 import (
    "项目名称/包名" // 文件夹名称作为包名   
 )

函数

函数是第一等公民,可作为参数传递。将复杂的函数签名定义为函数类型。


type Operation func(int, int) int


func add(x, y int) int {
    return x + y
}

func subtract(x int, y int) int {
	return x - y
}

func calculate(x int, y int, op Operation) int {
	return op(x, y)
}

func main() {
    a, b := 10, 5

	// 使用加法操作
	result1 := calculate(a, b, add)
	fmt.Println("Addition Result:", result1)

	// 使用减法操作
	result2 := calculate(a, b, subtract)
	fmt.Println("Subtraction Result:", result2)
}

值传递&引用传递

Go语言中,函数参数传递有两种方式:值传递和引用传递。

  1. 值传递:函数调用时,将实际参数的值复制一份传递给函数,这样在函数中对参数所做的修改不会影响到实际参数。
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func modifyPerson(p Person) {
    p.Name = "Alice"
    p.Age = 25
}

func main() {
    p := Person{Name: "Bob", Age: 30}
    modifyPerson(p)
    fmt.Println(p) // 输出: {Bob 30}
}
  • 分析 modifyPerson 函数,参数 p接收到的是Person结构体的副本,因此在函数内部修改p的属性并不会影响到外部的p。
  1. 引用传递:函数调用时,将实际参数的地址传递给函数,这样在函数中对参数所做的修改会影响到实际参数。
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func modifyPerson(p *Person) {
    p.Name = "Alice"
    p.Age = 25
}

func main() {
    p := Person{Name: "Bob", Age: 30}
    modifyPerson(&p)     // 传递的是指针
    fmt.Println(p) // 输出: {Alice 25}
}

注意事项

  1. 值传递&引用传递

  2. 函数类型

  3. 闭包函数中外部变量的传递-引用传递

  4. defer 延迟调用

  5. 函数与方法的区别

    1. 方法
      1. 方法是与特定类型关联的函数,是类型的一个成员
      2. 第一个参数是接收者,即调用该方法的对象
  6. 方法的调用

    1. 结构体实例调用方法
    type Person struct {
        Name string
        Age  int
    }      
    
            
    func (person *Person) Greet() {
        fmt.Println("Hello, my name is", person.Name)
    }
    func main() {
        p := Person{Name: "Alice", Age: 25}
        p.Greet() // 调用方法
    }
    
    1. 类型调用方法
    type Person struct {
        Name string
        Age  int
    }
    
    func (person Person) Greet() {
        fmt.Println("Hello, my name is", person.Name)
    }
    
    func main() {
        p := Person{Name: "Bob", Age: 30}
        Person.Greet(p) // 调用方法
      
    }
    

    注意:

    1. 结构体实例调用方法时,需要在实例上调用方法,即 p.Greet()
    2. 类型调用方法时,需要在类型上调用方法,即 Person.Greet(p)
    3. 区别:结构体实例调用方法时,需要在实例上调用,而类型调用方法时,需要在类型上调用。
    4. 区别:结构体实例调用方法时,需要在实例上调用,而类型调用方法时,需要在类型上调用。 type type