七日 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 循环遍历切片时,每次迭代都会返回两个值。 第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本。

相关推荐
wenjie学长5 小时前
[UE学习笔记]—划时代意义的两大功能—lumen和Nanite
笔记·学习·ue·三维数字化
摇滚侠5 小时前
Spring Boot 3零基础教程,WEB 开发 国际化 Spring Boot + Thymeleaf 笔记45
spring boot·笔记·后端
枫叶丹46 小时前
【Qt开发】多元素类控件(三)-> QTreeWidget
开发语言·数据库·c++·qt
晨非辰6 小时前
【数据结构入坑指南】--《层序分明:堆的实现、排序与TOP-K问题一站式攻克(源码实战)》
c语言·开发语言·数据结构·算法·面试
洲覆6 小时前
Redis 驱动适配 Reactor 模式
开发语言·网络·数据库·redis
fl1768316 小时前
基于matlab实现的DnCNN网络
开发语言·matlab
第二层皮-合肥6 小时前
如何设置等长的最大走线长度
服务器·开发语言·php
掘根6 小时前
【Protobuf】proto3语法详解1
开发语言·前端·javascript
Lee_yayayayaya6 小时前
《通信之道—从微积分到5G》阅读笔记
开发语言·matlab