diff --git a/BasicSyntax/Add/main.go b/BasicSyntax/Add/main.go new file mode 100644 index 0000000..2011819 --- /dev/null +++ b/BasicSyntax/Add/main.go @@ -0,0 +1,13 @@ +package main + +import "fmt" + +func main(){ + var n int + fmt.Scanf("%d", &n) + js := 0 + for i := 1; i <= n; i++ { + js += i + } + fmt.Println("%d", js) +} \ No newline at end of file diff --git a/BasicSyntax/Helloworld/hw.go b/BasicSyntax/Helloworld/hw.go new file mode 100644 index 0000000..47f2ef8 --- /dev/null +++ b/BasicSyntax/Helloworld/hw.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main(){ + fmt.Println("Hello World ohyeah") +} \ No newline at end of file diff --git a/BasicSyntax/Vector/main.go b/BasicSyntax/Vector/main.go new file mode 100644 index 0000000..51b5ebe --- /dev/null +++ b/BasicSyntax/Vector/main.go @@ -0,0 +1,40 @@ +package main + +import "fmt" + +func main() { + var n, m int + fmt.Scanf("%d %d", &n, &m) + + if m == 0 || n == 0 { + fmt.Println(0) + return + } + + arr := make([]int, n) + result := make([]int, n) + + // 输入数组 + for i := 0; i < n; i++ { + fmt.Scan(&arr[i]) + } + + // 计算前缀和 + 滑动窗口 + result[0] = arr[0] + for i := 1; i < n; i++ { + if i < m { + result[i] = result[i - 1] + arr[i] + } else { + result[i] = result[i - 1] + arr[i] - arr[i - m] + } + } + + min := result[m - 1] + for i := m; i < n; i++ { + if result[i] < min { + min = result[i] + } + } + + fmt.Printf("%d\n", min) +} diff --git a/std/func.md b/std/func.md new file mode 100644 index 0000000..1e52020 --- /dev/null +++ b/std/func.md @@ -0,0 +1,115 @@ +这个问题问得非常棒 👏,因为理解 **Go 的内置函数(builtin functions)** 是掌握这门语言的关键之一。 + +在 Go 里,“函数”可以分为三大类: + +1. ✅ **内置函数(built-in)** —— 不需要导包,直接用; +2. 📦 **标准库函数** —— 比如 `math.*`、`fmt.*` 等; +3. 🧑‍💻 **用户自定义函数** —— 你自己写的。 + +--- + +## 🧩 一、内置函数(Built-in Functions) + +这些是 Go 自带的核心函数,你可以在任何地方直接使用,不需要 `import`。 + +| 函数 | 功能 | +| ----------------------------------------- | ------------------------------ | +| **append(slice, elems...)** | 向切片末尾添加元素,返回新切片 | +| **len(v)** | 返回长度(适用于字符串、数组、切片、map、channel) | +| **cap(v)** | 返回容量(主要用于数组、切片、channel) | +| **make(t, ...)** | 创建切片、map 或 channel | +| **new(T)** | 分配类型 `T` 的零值内存,返回指针 `*T` | +| **copy(dst, src)** | 将 `src` 拷贝到 `dst`,返回复制的元素数 | +| **delete(m, key)** | 从 map 中删除指定 key | +| **close(ch)** | 关闭一个 channel | +| **complex(r, i)** | 构造复数(real + imag) | +| **real(c)** | 获取复数的实部 | +| **imag(c)** | 获取复数的虚部 | +| **panic(v)** | 触发运行时错误,立刻中止程序 | +| **recover()** | 从 `panic` 中恢复(常在 `defer` 中使用) | +| **print(args...)** / **println(args...)** | 简单打印调试(不建议用于正式输出) | + +--- + +### 🔍 举例: + +```go +package main + +import "fmt" + +func main() { + // 1️⃣ append + a := []int{1, 2} + a = append(a, 3, 4) + fmt.Println(a) // [1 2 3 4] + + // 2️⃣ len / cap + fmt.Println(len(a), cap(a)) // 4 4 + + // 3️⃣ make + m := make(map[string]int) + m["Alice"] = 10 + + // 4️⃣ delete + delete(m, "Alice") + + // 5️⃣ new + p := new(int) + *p = 42 + fmt.Println(*p) // 42 + + // 6️⃣ copy + b := make([]int, 2) + n := copy(b, a) + fmt.Println(b, n) // [1 2] 2 +} +``` + +--- + +## 🧮 二、标准库函数(来自包) + +这些需要 `import`,例如: + +| 包 | 常用函数 | +| --------- | ----------------------------------------- | +| `fmt` | `Println`, `Printf`, `Sprintf` | +| `math` | `Pow`, `Sqrt`, `Sin`, `Cos`, `Abs` | +| `strings` | `Split`, `Join`, `Contains`, `ToUpper` | +| `strconv` | `Itoa`, `Atoi`, `ParseFloat`, `FormatInt` | +| `time` | `Now`, `Sleep`, `Since` | +| `sort` | `Sort`, `Ints`, `Strings` | +| `os` | `Open`, `Create`, `ReadFile`, `WriteFile` | +| `io` | `Copy`, `ReadAll` | + +这些都不是语言级内置的,但在日常开发中使用频率极高。 + +--- + +## 🧑‍💻 三、你自己写的函数 + +```go +func add(a, b int) int { + return a + b +} + +func main() { + fmt.Println(add(3, 5)) // 8 +} +``` + +--- + +### 🧠 小结对比: + +| 类型 | 是否需 import | 示例 | 是否可重定义 | +| ----- | ---------- | ------------------------- | ------ | +| 内置函数 | ❌ | `len`, `append`, `make` | ❌ | +| 标准库函数 | ✅ | `math.Pow`, `fmt.Println` | ✅ | +| 自定义函数 | ✅ (你写的包) | `add`, `calc` | ✅ | + +--- + +要不要我帮你整理一份「Go 内置函数的源码级行为图」? +能清晰看到 `make`、`new`、`append` 这些在底层是怎么运作的(内存分配、指针传递、是否返回新切片等)。