go 函数

概述

  1. Go 没有 class,它通过 struct、方法、接口和组合实现面向对象编程.
+ go函数示例
package main

import (
  "fmt"
)

// f 的类型:接收一个 func(int,int)int 和一个 int,返回一个 int
func f(op func(int, int) int, x int) int {
  // 这里随便举例,把 x 和 10 作为参数传给 op
  return op(x, 10)
}

// 定义两个操作函数
func add(a, b int) int {
  return a + b
}

func mul(a, b int) int {
  return a * b
}

func main() {
  // 使用 f,并传入不同的操作函数
  result1 := f(add, 5) // add(5, 10) = 15
  result2 := f(mul, 5) // mul(5, 10) = 50
  fmt.Println("f(add, 5) =", result1)
  fmt.Println("f(mul, 5) =", result2)
}
指针传递与值传递示例
package main

import "fmt"

// 1. 值传递:不会改变原值
func changeValue(a int) {
  a = 100
}

// 2. 指针传递:可以修改原值
func changePointer(a *int) {
  *a = 100
}

// 3. 结构体示例
type User struct {
  Name string
  Age  int
}

// 值传递:不会修改原结构体
func updateUserValue(u User) {
  u.Name = "ChangedByValue"
}

// 指针传递:会修改原结构体
func updateUserPointer(u *User) {
  u.Name = "ChangedByPointer"
}

func main() {
  fmt.Println("=== 基础类型示例 ===")
  x := 10
  fmt.Println("初始 x =", x)

  changeValue(x)
  fmt.Println("值传递后 x =", x) // 仍然是 10

  changePointer(&x)
    fmt.Println("指针传递后 x =", x) // 被改成 100

    fmt.Println("\n=== 结构体示例 ===")
    user := User{Name: "Tom", Age: 20}
    fmt.Println("初始 user =", user)

    updateUserValue(user)
    fmt.Println("值传递后 user =", user) // Name 不变

    updateUserPointer(&user)
    fmt.Println("指针传递后 user =", user) // Name 被修改
}

接收者方法

接收者方法示例
package main

import "fmt"

// 定义一个结构体
type User struct {
    Name string
    Age  int
}

// 指针接收者方法:让用户“长大一岁”
func (u *User) GrowUp() {
    u.Age++
}

// 值接收者方法:只是打印,不修改数据
func (u User) SayHi() {
    fmt.Println("Hi, I'm", u.Name)
}

func main() {
    user := &User{Name: "Alice", Age: 20}

    user.SayHi()   // 调用值接收者方法
    user.GrowUp()  // 调用指针接收者方法,Age 会被修改

    fmt.Println("After GrowUp:", user.Age)
}