【4】函数与结构体

文章目录

    • 一、函数的基本流程及调用
    • 二、包的使用原理
    • 三、函数的使用注意事项
    • 四、`defer`的使用
    • 五、字符串常用系统函数
    • 六、时间函数
    • 七、常用内置函数
    • 八、错误处理机制及自定义错误

一、函数的基本流程及调用

package mainimport ("fmt""strings"
)// 定义简单的函数
func lowercaseWord(word string) string { // 函数名,形参先写变量,再定义对应的参数类型,然后再定义返回值类型word = strings.ToLower(word) // 函数体fmt.Println(word)return word // 函数返回值
}func main() {lowercaseWord("ABC") // 函数调用
}

二、包的使用原理

// 包的本质是创建不同的文件夹来存放 golang 程序。
// 文件第一行package 包名,包名与所在目录名一致,golang 程序从GOPATH路径开始查找。
// 包中对外可被引入的变量,函数与方法的名字需要大写。
// 同一个包内,变量和方法名等不能重复。

package mainimport ("code.byted.org/go_learning/utils" // 引入自定义的包,从 GOPATH 路径下开始引入"fmt"                              // 引入 golang 内部包
)func main() {res := utils.LowercaseWord("ABC") // 使用引入包中的函数fmt.Println(res)
}

重点:如果要编译一个可执行的文件,这个包必须声明为mainpackage main // 语法规范。

三、函数的使用注意事项

  1. 支持对返回值命名:
func cal(a, b int) (s int) {s = a + b // 函数返回值声明了变量类型后,函数体内不需要再进行类型申明return
}
  1. go 支持自定义数据类型:
package mainimport ("fmt"
)type MathCal func(int, int) int // 自定义一个函数数据类型func sub(a int, b int) int {return a - b
}func sum(a int, b int) int {return a + b
}func main() {var op MathCalop = subres := op(10, 20)fmt.Printf("%d\n", res)
}
  1. 使用_符号,可以忽略一个返回值:
package mainfunc mathCal(a int, b int) (sum int, sub int) {sum = a + bsub = a - breturn
}func main() {s, _ := mathCal(1, 2)println(s)
}
  1. 在 go 函数中支持可变参数,可变参数需要放在形参列表最后:
package mainimport "fmt"func sumNum(a int, args...int) int { // 可变参数放在形参最后面sum := afor _, arg := range args {sum += arg}fmt.Println(sum)return sum
}func main() {sumNum(1, 2, 3, 4, 5)
}

init函数,每个源文件可以有一个init函数,在main函数之前被调用:

package mainimport ("code.byted.org/go_learning/utils" // 1.先执行 import 包中全局变量及初始化 init 函数"fmt"
)func init() { // 再执行当前模块下的 init 函数fmt.Printf(utils.Name)fmt.Printf("%v", utils.Age)println("初始化 init 函数执行")
}func main() { // 再执行 main 函数println("主函数执行")
}

golang 匿名函数:

package mainimport "fmt"// golang 匿名函数func main() {res := func(a int, b int) int {return a * b}(1, 2) // 匿名函数,定义后即使用fmt.Printf("res value is:%v\n", res)}

golang 的闭包:
定义:闭包是一个函数值,它引用了其外部作用域中的变量。这个被引用的外部变量将和闭包函数一同存在,即使外部函数已经返回。

// 闭包package mainimport "fmt"func requestHandler(url string) func() {return func() {fmt.Println("Handling request for", url)}
}func main() {handler := requestHandler("https://example.com")// 在某个合适的时候执行闭包handler()
}

四、defer的使用

函数中的defer==在函数执行完成之后,及时释放资源。

package mainimport ("fmt""os"
)func main() {fmt.Println("打开一个文件...")file, _ := os.Open("/Users/bytedance/go/src/code.byted.org/go_learning/测试图片.gif")// 当执行到 defer 时,暂时先不会执行 defer 后面的语句,会先将 defer 后面的语句压到 defer 栈中// 函数执行完成后,通过先进后出的方式取出 defer 后的语句再进行执行,一般用于进行资源的关闭defer file.Close()}

五、字符串常用系统函数

package mainimport ("fmt""strconv""strings"
)func main() {// 1. len()计算字符串字节数:6println(len("我的"))// 2. 字符串遍历,同时处理有中文的字符,先转换为切片s := []rune("hello你好")for i := 0; i < len(s); i++ {fmt.Printf("%c\n", s[i])}// 3. 将字符串转换为整数atom, err := strconv.Atoi("12")if err!= nil {return}fmt.Println(atom)// 4. 将整数转化为字符串storm := strconv.Itoa(12)fmt.Println(storm)// 5.字符串转化为 byte 切片 [49 50]byteInfo := []byte(storm)fmt.Printf("%v\n", byteInfo)// 6.将 byte 切片转化为字符串 123strInfo := string([]byte{49, 50, 51})fmt.Println(strInfo)// 7.字符串是否包含字串 trueres := strings.Contains("hello", "he")println(res)// 8.统计字符串有几个字串 1num := strings.Count("hello", "he")println(num)// 9.不区分大小写字符串判断是否相等 trueres = strings.EqualFold("hello", "HeLLO")println(res)// 10.返回字串在字符串第一次/最后一次出现的 index 值,如果不存在则返回 -1num = strings.LastIndex("hellohe", "he")println(num)num = strings.Index("hello", "he")println(num)// 11.将指定的字串替换为另外的字串,可以指定替换数量或者全部替换<得到了一个新串>resString := strings.ReplaceAll("hellohello", "he", "HE")println(resString) // HElloHEllo// 12.字符串分割splitRes := strings.Split("hello world info", " ")fmt.Printf("%v\n", splitRes)// 13.字符串大小写转换upWord := strings.ToUpper("hello world")println(upWord)lowerWord := strings.ToLower("HELLO WORLD")println(lowerWord)// 14.去掉字符串两边的空格resString = strings.TrimSpace("xxx. ")println(resString)// 指定去掉两边的指定字符resString = strings.Trim("1xx1", "1")println(resString)// 去掉右边的指定字符resString = strings.TrimRight("1xx1", "1")println(resString)// 去掉左边的指定字符resString = strings.TrimLeft("1xx1", "1")println(resString)// 15.判断字符串是否以某个字符开头b := strings.HasPrefix("1xx1", "1")println(b)// 16.判断字符串是否以某个字符结尾b = strings.HasSuffix("1xx1", "1")println(b)
}

六、时间函数

// time

package mainimport ("fmt""time"
)func main() {// 获取当前时间now := time.Now()fmt.Printf("Res %v\n", now)// 获取当前时间的年月日时分秒fmt.Printf("年: %v\n", now.Year())fmt.Printf("月 %v\n", now.Month())fmt.Printf("月 %v\n", int(now.Month()))fmt.Printf("日 %v\n", now.Day())// 获取当前时间的格式化输出formatTime := now.Format("2006-1-2")fmt.Printf("%v\n", formatTime)// 时间常量fmt.Printf("时间常量秒: %v\n", time.Second)fmt.Printf("时间常量毫秒: %v\n", time.Millisecond)// 时间的 unix 和 unix 纳秒数fmt.Printf("unix 纳秒数:%v\n", now.UnixNano())// 获取两个时间差startTime := time.Now().Unix()endTime := time.Now().Unix()fmt.Printf("duration %v\n", endTime-startTime)
}

七、常用内置函数

https://studygolang.com/pkgdoc

package mainimport "fmt"type Person struct {Name stringAge  int
}func updatePerson(p *Person) {fmt.Printf("p = %v\n", &p) // ptr 存储指针地址的内存空间的地址println(p)p.Name = "Updated Name"p.Age = 30
}
func main() {ptr := new(Person)println(ptr)                   // 指针 ptr 存储的指针地址fmt.Printf("ptr = %v\n", &ptr) // ptr 存储指针地址的内存空间的地址updatePerson(ptr)fmt.Printf("ptr = %v\n", ptr) //fmt.Println(*ptr)             // 输出 {Updated Name 30}
}

// new(T)函数为一个类型为T的新项分配内存,并返回一个指向该类型零值的指针。

package mainimport "fmt"func main() {// 为类型为 int 分配新的内存,并返回一个该类型初始值的指针// prt 为指针类型,指向的内存空间存储的是:初始化类型存储的值的地址// 修改指针类型 prt 的值的方法:*prt = xxxprt := new(int)fmt.Printf("%v\n", prt) // 0x1400000e088res := cal(prt)fmt.Printf("%d\n", res)fmt.Printf("%v\n", prt)fmt.Printf("%v\n", *prt)
}func cal(a *int) int {fmt.Printf("cal params:%v\n", a) // 0x1400000e088*a = 100return *a
}

make()为引用类型分配内存。

八、错误处理机制及自定义错误

func queryDatabase() {db, err := sql.Open("driverName", "connectionString")if err!= nil {panic(err)}defer func() {if r := recover(); r!= nil {// 记录错误日志fmt.Println("Recovered from panic:", r)// 关闭数据库连接db.Close()}}()// 执行数据库查询操作rows, err := db.Query("SELECT * FROM table")if err!= nil {panic(err)}defer rows.Close()// 处理查询结果for rows.Next() {//...}
}
package mainimport ("fmt"
)func main() {defer func() {if r := recover(); r!= nil {// 记录错误日志fmt.Println("Recovered from panic:", r)}}()panic("error") // 引发 Panic 的代码}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

供应SW1108P集成氮化镓直驱的高频准谐振IC

1. 概述 SW1108P 是一款针对离线式反激变换器的高性能高集成度准谐振电流模式 PWM 控制器。 SW1108P 内置 6V 的驱动电压&#xff0c;可直接用于驱动氮化镓功率管&#xff1b;芯片工作于带谷底锁定功能 的谷底开启模式&#xff0c;同时集成频率抖动功能以优化 EMI 性能&…

uniapp使用中小问题及解决方法集合

1、 u-input 标签 设置只读、禁用后,click事件不生效 // 解决u-input 标签 设置只读、禁用后,click事件不生效&#xff08;不弹出弹框&#xff09; .input-disabled-click {pointer-events: none; }2、 uniapp实现u-datetime-picker时间选择器的默认日期定位&#xff0c;解决d…

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…

使用Nginx作为反向代理和负载均衡器

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Nginx作为反向代理和负载均衡器 引言 Nginx 简介 安装 Nginx Ubuntu CentOS 配置 Nginx 作为反向代理 配置 Nginx 作为负载…

「实战应用」使用 DHTMLX 构建数据透视表,促进有效的数据分析

概述&#xff1a;在本文中&#xff0c;您将了解组织何时选择数据透视表来处理大数据&#xff0c;并熟悉用于在网页上实现此功能的 DHTMLX 工具。 如今&#xff0c;高效处理大数据已成为企业的必需。企业每天必须处理大量数据&#xff0c;以将其转化为可操作的见解并获得竞争优…

Stable diffusion 3.5本地运行环境配置记录

1.环境配置 创建虚环境 conda create -n sd3.5 python3.10Pytorch(>2.0) conda install pytorch2.2.2 torchvision0.17.2 torchaudio2.2.2 pytorch-cuda12.1 -c pytorch -c nvidiaJupyter能使用Anaconda虚环境 conda install ipykernel python -m ipykernel install --user …

第 十 章 积极性,培训以及经验(程序员开发心理学)

1&#xff09;无论我们如何精心地为学习建立一个最佳的物理环境&#xff0c;如果不懂如何利用所有可能的信息来帮助学习&#xff0c;再好的环境也不可能保证手们能够成功地完成学习任务 2&#xff09;为了能够对信息的这种损失有所认识&#xff0c;请看这样一个例子 - 在一次测…

openGauss数据库-头歌实验1-4 数据库及表的创建

一、创建数据库 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;创建指定数据库。 &#xff08;二&#xff09;相关知识 数据库其实就是可以存放大量数据的仓库&#xff0c;学习数据库我们就从创建一个数据库开始吧。 为了完成本关任务&#xff0c;你需要掌握&a…

(自用复习题)常微分方程08

题目来源 常微分方程(第四版) (王高雄,周之铭,朱思铭,王寿松) 高等教育出版社 书中习题4.1 对应知识 非齐次线性微分方程 3.已知齐次线性微分方程的基本解组 x 1 , x 2 x_1,x_2 x1​,x2​&#xff0c;求下列方程对应的非齐次线性微分方程的通解 三道题都是常数变易法 (1)…

CSRF初级靶场

靶场 针对DVWA么有防御 源码&#xff1a; <?phpif( isset( $_GET[ Change ] ) ) {// Get input$pass_new $_GET[ password_new ];$pass_conf $_GET[ password_conf ];// Do the passwords match?if( $pass_new $pass_conf ) {// They do!$pass_new ((isset($GLOBA…

图解TCP三次握手:一步步构建网络会话

在互联网通信中&#xff0c;确保数据传输的可靠性至关重要。TCP三次握手的过程正是为了解决这一问题而设计的。在建立连接之前&#xff0c;客户端和服务器需要确认彼此的存在与准备状态&#xff0c;以防止因网络延迟或数据丢失而导致的错误。通过三次握手&#xff0c;双方不仅能…

[ shell 脚本实战篇 ] 编写恶意程序实现需求(恶意程序A监测特定目录B出现特定文件C执行恶意操作D-linux)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

讲讲RabbitMQ 性能优化

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ 性能优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲RabbitMQ 性能优化 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ 是一个强大的消息代理&#xff0c;广泛用于分布式系统中&#x…

2-139 基于matlab的弹道轨迹仿真

基于matlab的弹道轨迹仿真。设计GUI图形用户界面&#xff0c;对导弹参数根据需求进行设置&#xff0c;直观的实现更改攻角、各级火箭喷射时间等参数后得到对应参数下的导弹弹道图像以及导弹的飞行时间和飞行距离。得到飞行时间集导弹射程。程序已调通&#xff0c;可直接运行。 …

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs&#xff0c;创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件&#xff08;可选&…

AI 编译器学习笔记之十 -- 基于atc工具进行onnx到om转换

1、input_shape 获取&#xff1f; atc --modelmodelTTS5_32.onnx --framework5 --outputmodelTTS5_32 --soc_versionAscend910B4 --input_shape"x:1,-1;x_lengths:1;sid:1;tone:1,-1;language:1,-1;bert:1,1024,-1;ja_bert:1,768,-1" --precision_mode_v2origin a)…

HTML 基础标签——多媒体标签<img>、<object> 与 <embed>

文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…

Apache 负载均衡详细配置步骤

一、引言 在当今的互联网时代&#xff0c;随着业务的不断增长和用户量的增加&#xff0c;单一服务器往往难以满足高并发的请求。为了提高系统的可用性、可靠性和性能&#xff0c;负载均衡技术应运而生。Apache HTTP Server&#xff08;以下简称 Apache&#xff09;作为一款广泛…

《功能高分子学报》

《功能高分子学报》 中国标准连续出版物号:CN 31-1633/O6&#xff0c;国际标准连续出版物号&#xff1a;ISSN 1008-9357&#xff0c;邮发代号&#xff1a;4-629&#xff0c;刊期&#xff1a;双月刊。 《功能高分子学报》主要刊登功能高分子和其他高分子领域具有创新意义的学术…

Pandas进行数据查看与检查

在数据分析的工作流中,数据的初步查看与检查是非常重要的步骤。通过这一步,可以快速了解数据的结构、属性以及一些关键的统计信息,确保数据符合预期,或者发现数据中的潜在问题。 借助 pandas 库中的常用方法,如 DataFrame.head()、DataFrame.tail()、DataFrame.info() 和…