七日 Go 的自学笔记 (一)

文章目录


前言

学无止境啊,太深了


GPT 给我安排的七日学习计划

起步

安装什么的就不赘述了,去官网上照着做就好了

go 语法

直接开刷这个网址,这里面是一步一步学习的 https://tour.go-zh.org/welcome/1

这话的意思可能是:你导入了 "math/rand" 之后,可以用 rand 来调用里面的方法吧?

下面会记录一些我觉得比较重点的问题,或者是我想记录的东西

导出

函数

这种写法很像 ts

带名字的返回值

可以这样写,这样写,可读性会更好一些

不过有引出了新的问题: := 是啥?

go 复制代码
package main

import "fmt"

func split(sum int) (int, int) {
	x := sum * 4 / 9
	y := sum - x
	return x, y
}

func main() {
	fmt.Println(split((17)))
}

变量

第一次见

赋值

可以连着赋值

短变量声明

好的,刚才的疑惑来解答了

在函数中,短赋值语句 := 可在隐式确定类型的 var 声明中使用。

函数外的每个语句都 必须 以关键字开始(var、func 等),因此 := 结构不能在函数外使用。

基本类型

md 开始上强度了,开始看不懂了

哦哦大概能猜出来一些,%T 是这个变量的类型, %v 是这个变量的值,然后

有点数学意味的东西是位运算:

另一个是复数

再来复习一下什么是复数

零值

类型转换,类型推断

没玩出什么新花样

go 复制代码
package main

import "fmt"

func main() {
	// v := 42 // 修改这里看看!   // v is of type int
	// v := 42.1 // 修改这里看看!   // v is of type float64
	// v := 42.1 + 7i // 修改这里看看!   // v is of type complex128
	// v := false // 修改这里看看!   // v is of type bool
	// v := func() {} // 修改这里看看!   // v is of type func()
	fmt.Printf("v is of type %T\n", v)
}

常量

对fmt.print 的几个疑问

数值常量

Go 的常量在无类型状态下可以非常大,但一旦需要具体类型(比如 int),如果超出类型范围就会编译错误。

数学:左移运算符的理解

对应的右移运算符

总结

ok 基础的就这么多,第一天先这样吧 突然发现还有下一章,for 以及条件相关的,滚回来继续学了

for 循环

简单的循环跑一下 ,go 中的 for 循环没有括号

for 中的定义,以及步长都是可选的,可选之后,保存一下,分号就会变没的,之后的代码就太像 while

go 复制代码
package main

import "fmt"

func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
	fmt.Println(sum) //1024
}

if else

好吧 我感觉这么写没啥用的写法,了解一下再说

也就是说,他先算,算完之后再打印

switch 的用法

switch 语句是编写一连串 if - else 语句的简便方法。它运行第一个 case 值 值等于条件表达式的子句。

Go 的 switch 语句类似于 C、C++、Java、JavaScript 和 PHP 中的,不过 Go 只会运行选定的 case,而非之后所有的 case。 在效果上,Go 的做法相当于这些语言中为每个 case 后面自动添加了所需的 break 语句

在 Go 中,除非以 fallthrough 语句结束,否则分支会自动终止。 Go 的另一点重要的不同在于 switch 的 case 无需为常量,且取值不限于整数。

这里跟 js 还是有点区别的,在 go 中,就没有 break 这个东西了。

if / esle if / else 的更好的替代

defer 栈

  • 后进先出
  • 外层函数返回后执行
  • 推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。

指针、结构体、切片

切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取。

二维数组

go 复制代码
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 创建一个井字棋(经典游戏)
	board := [][]string{
		[]string{"_", "_", "_"},
		[]string{"_", "_", "_"},
		[]string{"_", "_", "_"},
	}

	// 两个玩家轮流打上 X 和 O
	board[0][0] = "X"
	board[2][2] = "O"
	board[1][2] = "X"
	board[1][0] = "O"
	board[0][2] = "X"

	for i := 0; i < len(board); i++ {
		fmt.Printf("%s\n", strings.Join(board[i], " "))
	}
}

切片的追加

问题:为什么容积是 6 呢?

range 遍历

range 会解构出下标和值

当使用 for 循环遍历切片时,每次迭代都会返回两个值。 第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本。

相关推荐
ttwuai11 小时前
Go 后台清空操作日志失败,权限和无 WHERE 删除怎么排查?
开发语言·后端·golang
西西弗Sisyphus11 小时前
Qt 在无边框窗口上做一套换肤系统
开发语言·数据库·qt
西西弗Sisyphus11 小时前
Qt 启动 UsageStatistic 插件报错
开发语言·qt
NeoGressAI外贸数字化11 小时前
外贸独立站零询盘排查:从 Google Search Console 到 PageSpeed 的技术实操
开发语言·c++
无小道11 小时前
C/C++——异步编程小记
开发语言·c++·c++11
奇树谦11 小时前
Pimpl 模式(d-pointer)详解:如何解决 C++ 头文件过大、编译依赖和 ABI 兼容问题
开发语言·c++
十铭忘11 小时前
英语介词怎么理解?
笔记
DevOpenClub11 小时前
Markdown、HTML 和 PPT 如何稳定交付:文档转换任务的幂等发布流程
开发语言·前端·c#·html·powerpoint
gsls20080811 小时前
OpsKat封装MCP:用 Go 标准库把运维 CLI 变成 AI 的“手“
运维·人工智能·golang·mcp
程序员夏洛11 小时前
谈谈你了解的最常见的几种设计模式,说说他们的应用场景
开发语言·python·模板方法模式