golang笔记
2022/3/3 6:17:35
本文主要是介绍golang笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
函数和包
init函数
每一个源文件都可以包含一个init函数,init会在main函数前被调用. 全局变量定义-->init函数-->main函数
匿名函数
方式1. 只能使用一次 res := func (n1 int) int { return n1+n1 } (10) 方式2. 可以多次使用 a := func (n1 int) int { return n1+n1 } a(10) 如果将匿名函数赋给一个全局变量,那么这个匿名函数就是全局匿名函数
闭包
func Test() func (int) int{ var n int = 10 return func (x int) int { n = n + x return n } } 调用: 每调用一次 f() 里面的值将进行累加 f := Test() fmt.println(f(2))
函数的defer
当执行到defer时, 暂不执行压入到独立的栈,当函数执行完后再执行, 出栈(先入后出 ) 如果涉及到变量, 则会将变量拷贝一份进栈, 当前函数变量的值修改后不会对栈内的值造成影响
函数参数传递方式
两种传递方式: 不管是值传递还是引用传递都是传递变量的拷贝,引用传递效率高,值传递取决于值的大小 如果希望函数内的变量能修改函数外的变量,可以传入变量的地址 &, 函数内以指针的方式操作变量
值类型
基本数据类型 int float bool string 数组 结构体struct
引用类型
指针 slice切片 map 管道chan interface等都是引用类型
变量的作用域
函数内声明/定义的变量叫局部变量,作用域仅函数内部 函数外声明/定义的变量叫全局变量,作用域整个包都有效,如果首字母为大写则整个程序都有效 变量是在一个代码块中 for if ,则只作用域仅该代码块
字符串常用的系统函数
len
go统一为utf-8, len统计汉字占3
字符串遍历(处理中文问题),
r := []rune(str)
字符串转整数
n, err := strconv.Atoi("12")
整数转字符串
n, err := strconv.Itoa(123456)
字符串转[]byte
b := []byte("hello")
[]byte转字符串
str := string([]byte{97,98,99})
10进制转 2,8,16进制
a := strconv.FormatInt(123, 2) // 结果类型是字符串
查找子串
strings.Contains("chinese", "es") // true
统计子串数量
strings.Count("chinese", "es") //1
不区分大小写比较
strings.EqualFold
查找索引位置
strings.Index("chinese", "es") // 首次出现 如果没有返回 -1 strings.LastIndex("chinese", "es") // 最后一次出现 如果没有返回 -1
替换
strings.Replace("abcabc", "a", "b", -1) // 数据, 查找目标, 替换成, 替换次数 -1为全部
分割成字符串数组
strings.Split("aaaa,ddd", ",")
大小写转换
strings.ToLower strings.TuUpper
头尾去掉字符
strings.TrimSpace(str) 头尾去空格 strings.Trim(str, "char") 头尾去掉指定字符 strings.TrimLeft(str, "char") 左边去掉指定字符 strings.TrimRight(str, "char") 右边去掉指定字符
判断是否以 字符开头和结尾
strings.HasPrefix(str, "char") //以字符开头 strings.HasSuffix(str, "char") // 以字符结尾
时间包 time 类py
now := time.Now() now.Year() //等 fmt.Printf或者fmt.Sprintf 格式化时间 now.Format(时间格式) time.Sleep(time.Second * 2) now.Unix()时间戳
内置函数
len
new
分配内存 分配值类型 如 int struct float32 返回的是指针
make
分配内存, 分配引用类型,比如 channel map slice
错误处理
go不支持传统的try, 引入了defer panic recover 使用场景: 抛出一个panic异常, 然后通过defer + recover捕获处理 func test() { defer func() { err := recover() if err != nil { fmt.Println(err) } } res := 10 / 0 fmt.Println(res) }
自定义错误
errors.New("错误说明") panic内置函数 接收一个interface{}类型的值作为参数, 可以接收error类型的变量,输出错误信息并退出程序 //返回一个error类型的值, 表示一个错误 func readConf(name string) (err error) { if name == "config.ini" { //读取... return nil } else { //返回一个自定义错误 return errors.New("读取文件错误..") } } err := readConf("config2.ini") if err != nil { //如果读取文件发送错误,就输出这个错误,并终止程序 panic(err) }
数组与切片
数组
数组是值类型,只能存放相同的一种数据 数组一旦声明定义了,其长度是固定的 数组的元素可以是任何数据类型, 但必须是同一种,不能混用 数组创建后如果没有赋值, 默认是零值 下标是0开始,有越界的异常,作为参数传递是默认是值拷贝 在其它函数中想去修改数组的值,可以使用引用传递(指针)
定义
方法一 var str [2]string str[0] = "world" str[1] = "hello" fmt.Println(str) 方法二 str1 := [2]string{"12", "safas"} var str1 [2]string = [2]string{"12", "safas"} var data [10]int data = [10]int{1, 2, 3, 4, 5} 方法三 [...]是规定写法 var str1 = [...]string{"12", "safas"} 方法四 var str1 = [...]string{1: "12", 0: "safas"} str1 := [...]string{1: "12", 0: "safas"}
数组在内存中的地址
&数组名就是地址, 第一个元素的地址也是数组的首地址,各元素地址间隔是依据数组的类型决定
使用
用下标访问 常规for遍历 for--range遍历 for index,val := range array01 { ... }
传递指针
arr := [3]int{11, 22, 33}
//函数1 func test01(arr [3]int) { arr[0] = 88 } test01(arr) //函数1不会改变原数组的值 //函数2 func test02(arr *[3]int) { fmt.Printf("arr指针的地址=%p", &arr) (*arr)[0] = 88 //!! } test02(&arr) //函数2 改变原数组的值
切片
这篇关于golang笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享