go理论知识记录(入门)

embedded/2025/1/29 6:24:55/

go理论知识记录(入门)

ps:来源于刘丹冰老师的课程

Go 语言中的变量定义

1. 使用 var 关键字定义变量

语法:

var 变量名 类型 =
  • 如果未初始化,变量会被赋予其类型的零值:
    var score int // 默认值为 0
    var isPass bool // 默认值为 false
    var greeting string // 默认值为 ""
    

2. 类型推断(省略类型)

Go 支持类型推断,可以根据初始值自动推断变量类型。

语法:

var 变量名 =

3. 短变量声明(:=

在函数内部,可以使用短变量声明(:=)来定义变量,省略 var 关键字和类型。

语法:

变量名 :=
  • 注意:短变量声明只能在函数内部使用。

4. 同时定义多个变量

可以一次性定义多个变量,用逗号分隔。

语法:

var 变量1, 变量2, 变量3 =1,2,3
5. 定义常量

使用 const 关键字定义常量,常量的值在程序运行期间不可修改。

语法:

const 常量名 =

6. 变量的作用域
  • 局部变量:在函数内部定义的变量,只能在该函数内部访问。
  • 全局变量:在函数外部定义的变量,可以在整个包内访问。

示例:

package mainimport "fmt"var globalVar = "I am global" // 全局变量func main() {localVar := "I am local" // 局部变量fmt.Println(globalVar)   // 可以访问全局变量fmt.Println(localVar)    // 可以访问局部变量
}

7. 匿名变量(_

使用 _ 作为变量名,表示忽略该值。

示例:

func getData() (int, string) {return 10, "hello"
}func main() {num, _ := getData() // 忽略第二个返回值fmt.Println(num)
}

关于导包的三种方式

pkg的包的最底层的init函数是最先执行的

  1. 匿名
  2. 起别名
  3. 全部导入

- 如果包导入之后不使用是会报错的 > 补救:在不直接用的包前面加上_表示是匿名导入 ```go import ( _ "goLearningDemo/init/lib1" "goLearningDemo/init/lib2" ) ```
  • 可以给包起别名
import (_ "goLearningDemo/init/lib1"myLib2 "goLearningDemo/init/lib2"
)
  • 如果是用.导包的话,视作是将包内所有的文件全都导入到目前的文件下面,那么当前文件内可以不用连着报名调用函数,而是直接调用
    尽量不用轻易使用
import (_ "goLearningDemo/init/lib1". "goLearningDemo/init/lib2"
)

指针

package main
import "fmt"func swap(a * int,b *int){var tmp inttmp = *a*a = *b *b = tmp
}func main(){a:=100b:=200swap(&a,&b)fmt.Println("a = ",a)fmt.Println("b = ",b)}

defer关键字

  • 谁最先提出谁最后执行
  • 如果defer和return都存在的情况,那么也是return先执行
package main
import "fmt"
func main ()  {defer fmt.Println("close1.....")defer fmt.Println("close2.....")fmt.Println("hello1")fmt.Println("hello2")
}
结果

hello1

hello2

close2…

close1…

切片 => 数组 (不初始化默认是0)

静态数组
  • 创建空数组,且大小固定
	var myarr1 [10] int

遍历方式:

    //第一种for i := 0; i < len(myarr1); i++ {fmt.Println(myarr1[i])}//第二种    for index,value:=range myarr1{fmt.Println("indexa:",index,",value = ",value)}
  • 创建大小固定的数组,初始化了前几个
	myarr1:= [10] int{1,2,3,4}
  • 查看数组的类型
	fmt.Printf("%T\n",myarr1)//res:[10]int
动态数组
package main
import "fmt"
//数组的长度是不固定的
//动态数组传参时候是引用传递的,方便在内部进行修改
func printArray(myarr []int)  {//不需要index的时候可以用小下划线代替for _ , value := range myarr{value = value - 1fmt.Println("value = ",value)} 
}
func main ()  {myarr2 := [] int {1,2,3,4}fmt.Printf("%T\n",myarr2)printArray(myarr2)
}
数组相关的api操作
追加元素
	//容量是5,但是目前只有三个元素(长度是3)var numbers = make([]int, 3,5)fmt.Printf("slice = %v\n",numbers)//追加元素1(当前长度是4)numbers = append(numbers,1)fmt.Printf("slice = %v\n",numbers)
追加元素
cap(numbers)
  • 如果在追加的时候,空间不够的话,go会给你再开辟一个新的大小为之前cap的容量

即每次扩容是翻倍

截取
	//切片s1 := numbers[0:2]fmt.Printf("s1 = %v\n",s1)
  • 切片的截取是左闭右开的[0,2)
  • 注意:这里的是浅拷贝,go是有copy函数去完成深拷贝的
	s1 := numbers[0:2]fmt.Printf("s1 = %v\n",s1)//深拷贝s2 := make([]int, 3)copy(s2,s1)fmt.Printf("s2 = %v\n",s2)

map

map的声明(三种)
  • 第一种方式
	//声明map(当前是空值)var myMap map[string]string//使用之前要先开辟空间myMap = make(map[string]string, 10)myMap["one"] = "java";myMap["two"] = "python";myMap["three"] = "C++";
  • 第二种方式(可以省略容量,直接开辟空间)
	myMap2 := make(map[string]string)myMap2["one"] = "java";myMap2["two"] = "python";myMap2["three"] = "C++";fmt.Println(myMap2)
  • 第三种方式,顺便初始化 !不需要开辟空间!
	myMap3 := map[string]string {"one":"java","two":"python","three":"C++",}fmt.Println(myMap3)#### 基本操作###### 1. 创建 Map
使用 `make` 函数创建一个 `map`:```go
cityMap := make(map[string]string)
2. 添加键值对

通过指定键来添加值:

cityMap["one"] = "beijing"
cityMap["two"] = "shanghai"
cityMap["three"] = "hefei"
3. 遍历 Map

使用 for range 循环遍历 map

fmt.Println("遍历======")
for key, value := range cityMap {fmt.Println("key = ", key)fmt.Println("value = ", value)
}
4. 删除键值对

使用 delete 函数删除指定键的键值对:

fmt.Println("删除======")
delete(cityMap, "one")for key, value := range cityMap {fmt.Println("key = ", key)fmt.Println("value = ", value)
}
5. 修改键值对

通过指定键来修改值:

fmt.Println("修改======")
cityMap["two"] = "wuhan"for key, value := range cityMap {fmt.Println("key = ", key)fmt.Println("value = ", value)
}

完整代码
package mainimport "fmt"func main() {// 创建 mapcityMap := make(map[string]string)// 添加键值对cityMap["one"] = "beijing"cityMap["two"] = "shanghai"cityMap["three"] = "hefei"// 遍历 mapfmt.Println("遍历======")for key, value := range cityMap {fmt.Println("key = ", key)fmt.Println("value = ", value)}// 删除键值对fmt.Println("删除======")delete(cityMap, "one")for key, value := range cityMap {fmt.Println("key = ", key)fmt.Println("value = ", value)}// 修改键值对fmt.Println("修改======")cityMap["two"] = "wuhan"for key, value := range cityMap {fmt.Println("key = ", key)fmt.Println("value = ", value)}
}

输出结果
遍历======
key =  one
value =  beijing
key =  two
value =  shanghai
key =  three
value =  hefei
删除======
key =  two
value =  shanghai
key =  three
value =  hefei
修改======
key =  two
value =  wuhan
key =  three
value =  hefei

注意
  1. 键的唯一性map 中的键是唯一的,如果重复添加相同的键,后添加的值会覆盖之前的值。
  2. 并发安全map 不是并发安全的。如果需要在并发环境中使用 map,需要使用同步机制(如 sync.Mapmutex)。

http://www.ppmy.cn/embedded/157395.html

相关文章

Linux 小火车

1.添加epel软件源 2.安装sl 3. 安装完成后输入&#xff1a; sl

Linux--权限

Linux系统的权限管理是保障系统安全的重要机制&#xff0c;以下详细讲解权限相关概念及操作指令&#xff1a; 一、基础权限机制 1. 权限的三元组&#xff0c;读&#xff08;r&#xff09;、写&#xff08;w&#xff09;、执行&#xff08;x&#xff09; 每个文件或目录有三组…

99.16 金融难点通俗解释:营业总收入

目录 0. 承前1. 简述2. 比喻&#xff1a;小明家的小卖部2.1 第一步&#xff1a;了解小卖部的收入来源2.2 第二步&#xff1a;计算一天的收入2.3 第三步&#xff1a;理解营业总收入 3. 生活中的例子3.1 小卖部的一周营业3.2 不同季节的变化 4. 小朋友要注意4.1 营业总收入不等于…

MacOS安装Docker battery-historian

文章目录 需求安装battery-historian实测配置国内源相关文章 需求 分析Android电池耗电情况、唤醒、doze状态等都要用battery-historian&#xff0c; 在 MacOS 上安装 battery-historian&#xff0c;可以使用 Docker 进行安装runcare/battery-historian:latest。装完不需要做任…

拖拽移动(Semi Design)

一、使用场景 用于设置元素可被拖动改变位置&#xff0c;支持限制拖拽范围&#xff0c;支持自定义触发拖动的元素。 二、使用方式 可通过 customMove 自定义拖动后的位置处理&#xff0c;该参数设置后&#xff0c;DragMove 组件内部将仅通过参数返回计算后的位置&#xff0c…

网络知识小科普--5

81、什么是组播路由? 组播路由是一种有针对性的广播形式&#xff0c;将消息发送到所选择的用户组&#xff0c;而不是将其发送到子网上的所有用户。 82、加密在网络上的重要性是什么? 加密是将信息转换成用户不可读的代码的过程。然后使用秘密密钥或密码将其翻译或解密回其…

Mac cursor设置jdk、Maven版本

基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数&#xff0c;运行cursor&#xff0c;按下ctrlshiftp&#xff0c;输入Open User Settings(JSON)&#xff0c;在弹出的下拉菜单中选中下面这样的&#xff1a; 在打开的json编辑器中追加下面的内容&#xff1a; {"…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作

Retrieve 检索 示例 1. 构造数据 创建表结构 create table exam1(id bigint, name varchar(20) comment同学姓名, Chinesedecimal(3,1) comment 语文成绩, Math decimal(3,1) comment 数学成绩, English decimal(3,1) comment 英语成绩 ); 插入测试数据 insert into ex…