首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go语言的过程式编程

Go语言的过程式编程

作者头像
宅蓝三木
发布于 2024-10-09 13:03:42
发布于 2024-10-09 13:03:42
10200
代码可运行
举报
文章被收录于专栏:三木的博客三木的博客
运行总次数:0
代码可运行

Go语言中常用的内置函数

函数

用法

append(s, …)

将s后面的所有参数追加到切片s中,如果容量不够,则新建一个切片

cap(x)

返回切片或者通道的容量,数组的长度

len(x)

返回切片、数组或者通道的长度

close(ch)

关闭通道,即不可以再往通道中写入值,但还可以读取

complex(r, i)

生成一个复数

copy(dist, src)

将切片src中的项复制到切片dist中,或者讲字符串src复制到[]byte类型的切片dist中

delete(m, k)

从映射m中删除键值为k的项

real(cx)

返回复数cx的实部

imag(cx)

返回复数cx的虚部

make(T, l, c)

创建一个切片、通道或者映射

new(T)

一个指向类型为T的值的指针

panic(x)

抛出一个运行时异常,其值为x

recover()

捕获一个运行时异常

Go语言赋值

  1. Go语言中的自增自减运算符都是后置的,且没有返回值。
  2. 可以使用=来给变量赋值,如果前面没有加var,那么变量必须是已经存在的。
  3. 可以使用逗号同时给多个变量赋值。a, b, c = 2, 3, 4
  4. 可以使用_来忽略赋值,它与任意类型兼容。
  5. 可以使用:=来同时声明和赋值一个变量。
  6. 当使用逗号和:=来给多个变量赋值时,要求其中至少有一个变量是新建的。
  7. 如果函数声明了返回值变量的名字,那么它在刚开始的时候会被初始化为其类型的零值。
  8. 函数在返回的时候如果没有明确的指定变量名,那么它将返回函数声明中的变量。

类型

  • Go语言使用result := Type(expr)来进行类型转换。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main
import "fmt"
func main() {
	runeSlice := []rune{'a', 'b', 'c'}
	str := string(runeSlice)
	fmt.Println(runeSlice)  // [97 98 99]
	fmt.Println(str) // abc
}
  • interface{}类型用于表示空接口,它可以表示任意类型的值。
  • expr.(Type)用于判断expr是不是类型Type。安全类型的成功判断返回expr的值和true,安全类型的失败判断返回该类型的零值和false。非安全类型的成功判断返回expr的值,失败触发panic。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
	var i interface{} = 99
	var s interface{} = []string{"left", "right"}
	j := i.(int)
	fmt.Printf("%T -> %d\n", i, j)  // int -> 99
	fmt.Printf("%T -> %q\n", s, s)  // []string -> ["left" "right"]
}

分支

  • if语句可以有可选的声明语句,在该语句中定义的变量其作用域限制在if语句之类。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if optionalStatement; booleanExpression {
	block
} else if optionalStatement1; booleanExpression1 {
	block1
} else {
	block2
}
  • switch语句默认不会向下贯穿,需要使用fallthrough语句。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
switch optionalStatement; optionalExpression {
case expressionList1: block1
...
default: blockN
}

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
switch Suffix(file) {
case ".gz":
  return GzipFileList(file)
case ".tar", ".tar.gz", ".tgz":
  return TarFileList(file)
case ".zip":
  return ZipFileList(file)
}
  • switch语句也可以用作类型开关,例如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
switch x.(type) {
case bool: block0
case int, int8, int16: block1
default: blockN
}

for循环语句

  • 无限循环
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for { block }
  • 普通循环
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for optionalPrestatement; booleanExpress; optionalPoststatement { block }
  • 遍历字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for idx, char := range aString { block }
for idx := range aString { block }
  • 遍历数组或切片
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for idx, item := range anArrayOrSlice { block }
for idx := range anArrayOrSlice { block }
  • 遍历映射
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for key, value := range aMap { block }
for key := range aMap { block }
  • 遍历通道
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for item := range aChannel { block }

select语句

select语句用来从多个通道中接收或发送数据。其语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select {
case sendOrReceive1: block1
...
case sendOrReceive2: block2
default: blockD
}

如果没有default语句,那么select语句是阻塞的,直到其中的一个channel可以执行。如果有default语句,那么select语句是非阻塞的,如果没有channel满足条件则会执行默认语句。

defer语句

defer语句的执行时机是:

  • 所在函数返回之前,返回值计算完成之后执行。
  • 多个defer语句以LIFO(Last In First Out)的方式执行。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
  fmt.Println(add1(1)) // 10
}

func add1(a int) (result int) {
	defer func () { result = 10 }()
  defer func () { result = 20 }()
	result = a + 1
	return result
}

panic和recover函数

不同于错误,异常是指不可能发生的情况发生了,通常是程序本身的问题,我们希望尽早发现问题所以通过调用panic函数抛出异常。panic被调用后,调用函数会中止执行,然后所有延迟执行的语句会执行,最后返回到上一层调用函数重复这样的过程直到main函数终止程序。 recover函数可以捕获异常并终止panic函数的冒泡。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func ConvertInt64ToInt(x int64) int {
	if math.MinInt32 <= x && x <= math.MaxInt32 {
		return int(x)
	}
	panic(fmt.Sprintf("%d is out of the int32 range", x))
}

func IntFromInt64(x int64) (i int, err error) {
	defer func(){
		if e:= recover(); e != nil {
			err = fmt.Errorf("%v", e)
		}
	}()
	i = ConvertInt64ToInt(x)
	return i, nil
}

自定义函数

  • Go语言可以在参数列表里的最后一个参数类型前面使用…实现可变参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
	test(3, "hello", "world")
}

func test(n int, strs ...string) {
	fmt.Println(strs) // [hello world]
	fmt.Println(n) // 3
}
  • Go语言不支持可选参数,但可以通过结构体来实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type Options struct {
	n   int
	str string
}

func main() {
	test(Options{n: 15, str: "hello world"})
	test(Options{n: 16})
}

func test(options Options) {
	fmt.Println(options.n)
	fmt.Println(options.str)
}
  • init和main函数不接受任何参数也不返回任何值,init在main函数调用之前执行
  • 闭包是指捕获了和它在同一作用域常量或者变量的函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
	"fmt"
	"strings"
)

func main() {
	addjpg := MakeAddSuffix(".jpg")
	addpng := MakeAddSuffix(".png")
	fmt.Println(addjpg("hello"))  // hello.jpg
	fmt.Println(addpng("hello.png"))  // hello.png
}

func MakeAddSuffix(suffix string) func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis学习二(数据操作).
在 redis-cli 中使用中文时,必须打开 --raw 选项,才能正常显示中文。
JMCui
2019/10/21
4450
Python操作Redis和Memcac
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
py3study
2020/01/06
6140
Python操作Redis和Memcac
Redis学习-入门篇
Redis 是一个支持网络交互的、可基于内存也可持久化的Key-Value数据库(非关系性数据库),它不仅性能强劲,而且还具有复制特性; Redis提供了五种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上。
江涛学编程
2023/05/27
3030
Redis学习-入门篇
[喵咪Redis]Redis安装与介绍
[喵咪Redis]Redis安装与介绍 前言 哈喽大家好啊,这次要来和大家一起来了解学习Redis的一系列技术,最终目的是搭建一个高可用redis集群自动负载灾备,那我们先从最基础的Redis的一些基
喵了个咪233
2018/03/02
1.1K0
[喵咪Redis]Redis安装与介绍
高并发架构系列:Redis的基本介绍,五种数据类型及应用场景分析
Redis数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
用户5546570
2019/07/02
1.1K0
高并发架构系列:Redis的基本介绍,五种数据类型及应用场景分析
Redis
REmote DIctionary Server(Redis) 是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的,日志型键值对存储的,非关系型数据库。 通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
matt
2022/10/25
3750
Linux部署Redis(单机版)
“ 当数据库数据量过大的时候,大量的IO操作会成为网站性能的瓶颈,而Redis可以大量减少与数据库的交互,提高网站性能。”
每天学Java
2020/06/01
2.8K0
Linux部署Redis(单机版)
redis常用命令大全
Jensen_97
2023/07/20
4310
redis常用命令大全
Redis数据库及其基本操作
Redis 是一个高性能的key-value数据库, 支持主从同步, 完全实现了发布/订阅机制, 因此可以用于聊天室等场景. 主要表现于多个浏览器之间的信息同步和实时更新.
周小董
2019/03/25
8060
Redis数据库及其基本操作
redis全面解析
Redis 是开源免费的,遵守BSD协议,是一个高性能的key-value非关系型数据库。
Java架构师必看
2021/05/14
5090
redis全面解析
Redis入门之认识redis(一)
  1) NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。
用户2417870
2020/10/28
4200
Redis入门之认识redis(一)
redis学习笔记
视频链接:https://www.bilibili.com/video/BV1Rv41177Af/?spm_id_from=333.999.0.0 1. redis概述 开源的nosql数据库,key
用户8126523
2023/01/02
1K0
Redis使用与操作k-v数据
redis是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。
Tim在路上
2020/08/04
1.1K0
Redis教程(一)--Keep Learning系列
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
王也518
2022/10/26
3130
Redis教程(一)--Keep Learning系列
只需5分钟,完成Redis所有命令操作~
Redis存储的是key-value结构的数据,其中key是字符串类型,value数据类型有:
田维常
2023/11/14
5280
只需5分钟,完成Redis所有命令操作~
【Redis】349- Redis 入门指南
Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
pingan8787
2019/09/17
5530
【Redis】349- Redis 入门指南
Redis最基础内容
String类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:
ha_lydms
2023/08/10
3101
Redis最基础内容
Redis 基础数据结构
Redis 基础数据结构
Java架构师必看
2021/05/14
1.3K0
Redis 基础数据结构
Redis各种数据类型
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。
暴躁的程序猿
2022/03/23
7310
Redis实战之Redis命令
  Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为string(字符串),list(列表),set(集合),hash(散列),zset(有序集合),下面将分别对这5种数据类型的控制命令进行总结,熟话说好记性不如烂笔头,方便以后查看。
全栈程序员站长
2021/12/31
8790
Redis实战之Redis命令
相关推荐
Redis学习二(数据操作).
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验