函数

返回值

func add(numList ...int) (int, string) {
    var a int = 0
    for _, value := range numList {
        a += value
    }
    return a, "计算成功"
}

返回类型就写在参数后面(类型,类型)

fmt.Println(add(1, 2, 3, 4, 5))

2026-01-18T02:56:05.png

上面是未定义需要写在return后方,下面就是定义写法,直接return

func info(age int, name string) (Age int, Name string) {
    Age = age
    Name = name
    return
}

fmt.Println(info(18, "张三"))

2026-01-18T02:56:21.png

匿名函数

函数里面不能直接定义函数
2026-01-18T02:56:41.png
但是可以通过定义变量未函数调用
    var printName = func(name string) {
        fmt.Println(name)
    }
    printName("我是一个人")

结构体

package main

import "fmt"

type Student struct {
    Teacher //继承
    Name    string
    Age     int
}

type Teacher struct {
    Name string
    Age  int
}

func (s *Student) SetName(Name string) {
    s.Name = Name
}

func main() {

    t1 := Teacher{
        Name: "王老师",
        Age:  34,
    }
    s1 := Student{
        Teacher: t1,
        Name:    "小明",
        Age:     18,
    }
    s1.SetName("小白兔")
    fmt.Println(s1.Teacher.Name)
    fmt.Println(s1.Name)

}

2026-01-18T02:57:02.png
2026-01-18T02:57:21.png
2026-01-18T02:57:29.png
传递的时候使用指针即可修改

tag

 package main

import (
    "encoding/json"
    "fmt"
)

type Fruit struct {
    Name  string `json:"name"`
    Color string `json:"color"`
    Price int    `json:"price"`
    Else  string `json:"else"`
}

func main() {
    fruit := Fruit{Name: "苹果", Color: "红色"}
    byteData, _ := json.Marshal(fruit)
    fmt.Println(string(byteData))

}

2026-01-18T04:02:23.png

忽略字段(直接忽略)

直接使用 "-" 定义
2026-01-18T04:03:48.png

为空忽略(当原来的数据为空即忽略)

使用omitempty
2026-01-18T04:08:03.png
但是如果的原来不是空,而是这个类型的初始值,也会忽略
2026-01-18T04:10:07.png

常见的零值

2026-01-18T04:12:57.png
2026-01-18T04:19:45.png

注意bool为false会忽略

接口

2026-01-18T11:38:52.png


type People interface {
    eat()
    getName() string
}
type Teacher struct{ Name string }
type Student struct{ Name string }
type Worker struct{ Name string }

func (T Teacher) eat() { fmt.Println(T.Name, "在吃东西") }
func (T Teacher) getName() string {
    return T.Name
}
func (S Student) eat() { fmt.Println(S.Name, "在吃东西") }
func (S Student) getName() string {
    return S.Name
}
func (W Worker) getName() { fmt.Println("不带返回类型,识别不到") }
func eat(P People)        { P.eat() }

func main() {
    T := Teacher{Name: "王老师"}
    eat(T)
    S := Student{Name: "小明"}
    eat(S)
}

统一func eat(P People) { P.eat() }来取代调用
2026-01-18T11:40:53.png

类型断言

上面的取代方法func eat(P People)
我们只想给老师吃东西,那么就先判断类型
2026-01-18T11:46:07.png