Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​go语言的31个坑
在其他大多数语言中,{的位置你自行决定。Go比较特别,遵守分号注入规则(automatic semicolon injection):编译器会在每行代码尾部特定分隔符后加;来分隔多条语句,比如会在 )后加分号:
阿兵云原生
2023/02/16
8570
Go语言常见坑
这里列举的Go语言常见坑都是符合Go语言语法的, 可以正常的编译, 但是可能是运行结果错误, 或者是有资源泄漏的风险。
我的小碗汤
2018/08/22
6230
【Golang语言社区】Golang语言面试题
最近在很多地方看到了golang的面试题,看到了很多人对Golang的面试题心存恐惧,也是为了复习基础,我把解题的过程总结下来。
李海彬
2018/03/07
4K2
【Golang语言社区】Golang语言面试题
golang教程
这里有两个关键点。 - 其一是defer关键字。defer语句的含义是不管程序是否出现异常,均 在函数退出时自动执行相关代码。 - 其二是Go语言的函数允许返回多个值。
陨石坠灭
2020/01/21
1.2K0
golang教程
Go语言学习(六)| 函数
如果有连续若干个参数,它们的类型一致,那么我们无须一一罗列,只需在最后一个参数后添加该类型。例:
Mervyn
2020/07/21
4650
《Go语言入门经典》4~6章读书笔记
在Go语言中,可在函数签名中声明多个返回值,让函数返回多个结果。在这种情况下,终止语句可返回多个值。
跑马溜溜的球
2020/12/07
7220
Go语言常见的坑
这里列举的Go语言常见坑都是符合Go语言语法的,可以正常的编译,但是可能是运行结果错误,或者是有资源泄漏的风险。
冬夜先生
2021/09/03
6590
Go语言入门(四)Map&函数
map&函数 map类型 map的申明和定义 map是一个key-value的数据结构,是引用类型的数据结构,需要初始化 初始化的时候容量可以定义,也可以不定义 map必须初始化才能使用,否则会panic var a map[key的类型]value的类型 func defineMap() { var user map[string]int = make(map[string]int) user["abc"] = 38 fmt.Printf("user:%v\n",user) a :
alexhuiwang
2020/09/24
5110
Go语言入门——函数
使用struct去定义自己想要的数据模型就好比定义一个Java中的model一样……
JackieZheng
2019/07/02
5160
《郝林 :Go语言第一课》学习笔记
本文是慕课网上郝林的《Go语言第一课》的学习笔记。作为一名老码农,最近才下定决心来学习新的语言,有点惭愧,也有点兴奋。 本文是课程的学习笔记,重点把GO基本语法学习中的精要点做了下总结,也是给郝林老师的一个汇报。 学习GO语言,欢迎从郝林的《Go语言第一课》开始。
辉哥
2019/03/20
8020
《郝林 :Go语言第一课》学习笔记
golang学习笔记之一 - 基础知识与概念
go中字符称为rune,等价于C中的char,可直接与整数转换。rune实际是整型,必需先将其转换为string才能打印出来,否则打印出来的是一个ascii整数
躺平程序员老修
2023/09/05
2950
人生人生苦短,Let's Go !!!
函数既可以接受可变参数也可以接受固定参数,接受可变参数时放在函数的最后,固定参数当然是必须传值的,go语言中没有默认参数
疯狂的KK
2021/04/26
4430
人生人生苦短,Let's Go !!!
Go语言入门——进阶语法篇(四)
Go语言没有类似Java或Python那种try...catch...机制处理异常,Go的哲学是与众不同的,Go的设计者认为主流的异常处理机制是一种被过度滥用的技巧,而且存在很大的潜在危害,Go的异常处理(或者说是错误处理)是一种非常简单直观的方式。通常的,我们在写Java、Python之类的代码时,遇到可能存在的异常,直接用try括起来,使用catch捕获,然后就万事大吉了,当系统长时间的运行时,大大增加了不稳定性,所积累的问题可能在某一刻爆发。而Go者使用一种称为"恐慌的"机制,在有必要时,直接让系统宕机,让问题发生时立刻暴露出来,不必累积。很难说哪种设计更好,但Go语言确实简化了代码。
arcticfox
2019/09/03
5780
Go 速查表
以下是整理后的 Go 语言速查表,涵盖语法、依赖管理、数据类型、常用功能等核心知识点,结构清晰便于快速查阅:
timerring
2025/02/12
1320
Go语言基础速刷手册
这个“不务正业”的阿巩,今天冒着现学现卖的风险来和大家分享Go了,作为既具备C的理念又有Python 姿态的语言,怎么能不来试上一试呢!
才浅Coding攻略
2022/12/12
9560
Go语言学习笔记——常用关键字
for...range完成数据迭代,支持字符串、数组、数组指针、切片、字典、通道类型,返回索引、键值数据。
windealli
2024/04/15
2120
Go语言学习笔记——常用关键字
Go语言学习笔记——常用关键字
for...range完成数据迭代,支持字符串、数组、数组指针、切片、字典、通道类型,返回索引、键值数据。
windealli
2024/04/10
2020
Go语言学习笔记——常用关键字
Golang语言中的流程控制结构和函数详解
流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。Go中流程控制分三大类:条件判断,循环控制和无条件跳转。 if if也许是各种编程语言中最常见的了,它的语法概括起来就是:如果满足条件就做某事,否则做另一件事。 Go里面if条件判断语句中不需要括号,如下代码所示: 代码如下: if x > 10 { fmt.Println("x is greater than 10") } else { fmt.Println("x is less
李海彬
2018/03/21
9420
Golang语言中的流程控制结构和函数详解
【Go 基础篇】Go语言关键字和预定义标识符解析:探索编程的基石与核心要素
在计算机编程中,关键字(Keywords)和预定义标识符(Predefined Identifiers)是编程语言的核心要素,它们在语法结构和语言功能中起到重要作用。在Go语言(Golang)中,关键字和预定义标识符定义了编程的基本规则和构建块,是实现功能的关键。本篇博客将深入探讨Go语言中的关键字和预定义标识符,包括关键字的分类、每个关键字的含义和用法,以及预定义标识符的作用和应用,帮助读者更好地理解Go语言的核心特性。
繁依Fanyi
2023/10/12
5960
4.Go编程快速入门学习
描述: Go 语言中的指针区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算是安全指针。
全栈工程师修炼指南
2022/09/29
7240
4.Go编程快速入门学习
相关推荐
​go语言的31个坑
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验