Go学习第六章——系统函数与错误处理

news2024/11/16 3:14:59

Go系统函数与错误处理

      • 1 字符串相关系统函数
      • 2 时间和日期相关的函数
        • 2.1 Now函数
        • 2.2 日期的格式化
      • 3 内置函数
      • 4 错误处理
        • 4.1 基本使用
        • 4.2 自定义错误

1 字符串相关系统函数

下面给出20个常见的函数,不需要导包,直接可以用

func main() {
    // 1.统计字符串的长度,按字节 len(str)
    // golang的编码统一为utf-8(ascii的字符(字母和数字))占一个字节,汉字占用3个字节
    str := "hello北"
    fmt.Println("str len=", len(str))
    //输出:str len= 8

    // 2.字符串遍历,同时处理有中问的问题 r := []rune(str)
    str2 := "hello北京"
    r := []rune(str2)
    for i := 0; i < len(r); i++ {
       fmt.Printf("字符=%c\n", r[i])
    }
    // 输出:
    // 字符=h
    // 字符=e
    // 字符=l
    // 字符=l
    // 字符=o
    // 字符=北
    // 字符=京

    // 3.字符串 转 整数:n, err := strconv.Atoi("12")
    n, err := strconv.Atoi("123")
    if err != nil {
       fmt.Println("转换错误", err)
    } else {
       fmt.Println("转成的结果是", n)
    }
    // 输出:转成的结果是 123

    // 4.整数 转 字符串 str = strconv.Itoa(12345)
    str = strconv.Itoa(12345)
    fmt.Printf("str=%v, str=%T\n", str, str)
    // 输出:str=12345, str=string

    // 5.字符串 转 []byte: var bytes = []byte("hello go")
    var bytes = []byte("hello go")
    fmt.Printf("bytes=%v\n", bytes)
    // 输出:bytes=[104 101 108 108 111 32 103 111]

    // 6.[]byte 转 字符串: str = string([]byte{97, 98, 99})
    str = string([]byte{97, 98, 99})
    fmt.Printf("str=%v\n", str)
    // 输出:str=abc

}

还有好多,我这里直接不按照代码看了,具体查看官方文档~~

  1. 10进制转 2, 8, 16进制: str = strconv.FormatInt(123, 2),返回对应的字符串
  2. 查找子串是否在指定的字符串中: strings.Contains("seafood", "foo") //true
  3. 统计一个字符串有几个指定的子串 : strings.Count("ceheese", "e") //4
  4. 不区分大小写的字符串比较(==是区分字母大小写的): **fmt.Println(strings.EqualFold(“abc”, “Abc”)) **// true
  5. 返回子串在字符串第一次出现的index值,如果没有返回-1 : strings.Index("NLT_abc", "abc") // 4
  6. 返回子串在字符串最后一次出现的index,如没有返回-1 : strings.LastIndex("go golang", "go")
  7. 将指定的子串替换成 另外一个子串: strings.Replace("go go hello", "go", "go语言", n)
    n可以指定你希望替换几个,如果n=-1表示全部替换
  8. 按照指定的某个字符,为分割标识,将一个字符串拆分成字符串数组: strings.Split(“hello,wrold,ok”, “,”)
  9. 将字符串的字母进行大小写的转换: strings.ToLower("Go") // go strings.ToUpper(“Go”) -> GO
  10. 将字符串左右两边的空格去掉: strings.TrimSpace(" tn a lone gopher ntrn ")
  11. 将字符串左右两边指定的字符去掉 :
    strings.Trim("! hello! ", " !") // ["hello"] //将左右两边 ! 和 " "去掉
  12. 将字符串左边指定的字符去掉 : strings.TrimLeft ()
  13. 将字符串右边指定的字符去掉 : strings.TrimRight ()
  14. 判断字符串是否以指定的字符串开头: strings.HasPrefix("ftp://192.168.10.1", "ftp") // true

2 时间和日期相关的函数

说明:在编程中,经常使用到日期相关的函数,比如:统计某段代码执行消费的时间等等。

2.1 Now函数

时间和日期的函数,需要到入time包,所以你获取当前时间,就要调用函数Now函数:

func main() {
	// Now()返回值是一个结构体,类型是:time.Time
	nowTime := time.Now()
	fmt.Printf("%v ~~~ 对应的类型为:%T\n", nowTime, nowTime)

	//调用结构体中的方法:
	fmt.Printf("年:%v \n", nowTime.Year())
	fmt.Printf("月:%v \n", nowTime.Month())      
	fmt.Printf("月:%v \n", int(nowTime.Month())) 
	fmt.Printf("日:%v \n", nowTime.Day())
	fmt.Printf("时:%v \n", nowTime.Hour())
	fmt.Printf("分:%v \n", nowTime.Minute())
	fmt.Printf("秒:%v \n", nowTime.Second())
}

输出:

2023-10-23 22:03:36.4169858 +0800 CST m=+0.011527901 ~~~ 对应的类型为:time.Time
年:2023    
月:October 
月:10      
日:23      
时:22      
分:3       
秒:36    
2.2 日期的格式化
  • 将日期以年月日时分秒按照格式输出为字符串:
func main() {
	// Now()返回值是一个结构体,类型是:time.Time
	now := time.Now()

	//Printf将字符串直接输出:
	fmt.Printf("当前年月日: %d-%d-%d 时分秒:%d:%d:%d  \n", now.Year(), now.Month(),
		now.Day(), now.Hour(), now.Minute(), now.Second())
	//Sprintf可以得到这个字符串,以便后续使用:
	datestr := fmt.Sprintf("当前年月日: %d-%d-%d 时分秒:%d:%d:%d  \n", now.Year(), now.Month(),
		now.Day(), now.Hour(), now.Minute(), now.Second())
	fmt.Println(datestr)
}

输出结果:

当前年月日: 2023-10-23 时分秒:22:3:56  
当前年月日: 2023-10-23 时分秒:22:3:56 
  • 按照指定格式:
func main() {
    // Now()返回值是一个结构体,类型是:time.Time
    now := time.Now()

    //这个参数字符串的各个数字必须是固定的,必须这样写
    datestr2 := now.Format("2006/01/02 15/04/05")
    fmt.Println(datestr2)
    //选择任意的组合都是可以的,根据需求自己选择就可以(自己任意组合)。
    datestr3 := now.Format("2006 15:04")
    fmt.Println(datestr3)
}

输出结果:

2023/10/23 22/04/37
2023 22:04

3 内置函数

  1. 什么是内置函数/内建函数:
    Golang设计者为了编程方便,提供了一些函数,这些函数不用导包可以直接使用,我们称为Go的内置函数/内建函数。

  2. 内置函数存放位置:
    在builtin包下,使用内置函数也的,直接用就行

  3. 常用函数:

(1)len函数:
统计字符串的长度,按字节进行统计

(2)new函数:
分配内存,主要用来分配值类型(int系列, float系列, bool, string、数组和结构体struct)

func main() {

	num1 := 100
	fmt.Printf("num1的类型%T , num1的值=%v , num1的地址%v\n", num1, num1, &num1)

	num2 := new(int) // *int
	//num2的类型%T => *int
	//num2的值 = 地址 0xc04204c098 (这个地址是系统分配)
	//num2的地址%v = 地址 0xc04206a020  (这个地址是系统分配)
	//num2指向的值 = 100
	*num2  = 100
	fmt.Printf("num2的类型%T , num2的值=%v , num2的地址%v\n num2这个指针,指向的值=%v", 
		num2, num2, &num2, *num2)
}

输出结果:

num1的类型int , num1的值=100 , num1的地址0x940a0b8
num2的类型*int , num2的值=0x940a0bc , num2的地址0x9422058
 num2这个指针,指向的值=100

模拟内存图的情况,如图:

在这里插入图片描述

(3)make函数:
分配内存,主要用来分配引用类型(指针、slice切片、map、管道chan、interface 等)后面再将~~

4 错误处理

  1. 先写个必定报错的代码
import "fmt"

func test() {
	num1 := 10
	num2 := 0
	res := num1 / num2
	fmt.Println("res=", res)
}

func main() {
	test()
	fmt.Println("下面的代码和逻辑。。。。")
}

报错显示:

panic: runtime error: integer divide by zero

这里的panic代表的意思是恐慌,也就是致命错误,会直接崩溃,断掉连接

4.1 基本使用

Go中引入的处理方式为:defer,panic,recover三个函数

Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常的处理

func test() {
	// 使用defer + recover 来捕获和处理异常
	defer func() {
		err := recover() // recover()内置函数,可以捕获到异常
		if err != nil {
			fmt.Println("err=", err)
		}
	}()
	num1 := 10
	num2 := 0
	res := num1 / num2
	fmt.Println("res=", res)
}

func main() {
	test()
	fmt.Println("下面的代码和逻辑。。。。")
}

输出结果:

err= runtime error: integer divide by zero
下面的代码和逻辑。。。。

会发现,异常被抛出,而且还能继续执行下面的代码~~

4.2 自定义错误

Go也支持自定义错误,使用errors.New 和 panic 内置函数实现。

  1. errors.New(“错误说明”),会返回一个error类型的值,表示一个错误

  2. panic内置函数,接受一个interface{}类型的值(也就是任何值了)作为参数。可以接受error类型的遍历,输出错误信息,并退出程序

如果err := readConf("config.ini"),也就是正确的,就没有问题~

// 函数去读取以配置文件init.conf的信息
// 如果文件名传入不正确,我们就返回一个自定义的错误
func readConf(name string) (err error) {
	if name == "config.ini" {
		//读取...
		return nil
	} else {
		//返回一个自定义错误
		return errors.New("读取文件错误..")
	}
}

func test() {
	err := readConf("config.ini")
	if err != nil {
		//如果读取文件发送错误,就输出这个错误,并终止程序
		panic(err)
	}
	fmt.Println("test()继续执行....")
}

func main() {
	test()
	fmt.Println("main()下面的代码。。。。")
}

输出结果:

test()继续执行....
main()下面的代码。。。。

如果err := readConf("config2.ini"),也就是错误的,就会报错,并且中止程序

输出结果如下:

panic: 读取文件错误..

goroutine 1 [running]:
main.test()
        F:/gocode/GoStudy_Day1/Day03/model/main/test.go:24 +0xb0
main.main()
        F:/gocode/GoStudy_Day1/Day03/model/main/test.go:30 +0x18

Process finished with the exit code 2

第六章结束啦~~按道理应该属于函数章节,但我觉得应该拉出来单独,这样好理解一些~!!

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

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

相关文章

Synchronized同步锁

synchronized 一&#xff0c;介绍 Java中的synchronized关键字用于实现线程同步&#xff0c;可以修饰方法或代码块。 1. 修饰方法&#xff1a;当一个方法被synchronized修饰时&#xff0c;只有获得该方法的锁的线程才能执行该方法。其他线程需要等待锁的释放才能执行该方法。…

Java Netty - Buffer类

Buffer类 当应用程序进行数据传输的时候&#xff0c;往往需要使用缓冲区&#xff0c;常用的缓存区就是JDK NIO类库提供的 java.nio.Buffer&#xff1b; NIO的Buffer本质上是一个内存块&#xff0c;既可以写入数据&#xff0c;也可以从中读取数据&#xff1b; 其中&#xff0c;…

IP地址定位是什么?有哪些优缺点?

IP地址定位是一种用于确定设备或用户地理位置的方法&#xff0c;具有一些明显的优点和缺点。以下是IP地址定位的优缺点&#xff1a; 优点&#xff1a; 广泛适用性&#xff1a; IP地址定位适用于几乎所有与互联网连接的设备&#xff0c;包括计算机、智能手机、平板电脑和物联网…

全链路压测专题---2、全链路压测架构和技术

如何开展全链路压测 业务模型梳理 首先应该将核心业务和非核心业务进行拆分&#xff0c;确认流量高峰针对的是哪些业务场景和模块&#xff0c;针对性的进行扩容准备梳理出对外的接口&#xff1a;使用MOCK&#xff08;模拟&#xff09;方式做挡板千万不要污染正常数据&#xf…

包装类知识.JDK7,JDK8相关时间类练习

包装类 包装类:基本数据类型对应的引用类型 JDK5之前的Integer包装类 如下 了解即可 i5传入的值 第一个是字符串,第二个是进制数.为83是因为再打印的时将123看成8进制了 然后打印转化为10进制 区别对比 public static void main(String[] args) {Integer i1 Integer.valu…

5年经验之谈 —— 手把手教你接口性能测试之工具篇!

本文是我们《手把手教你接口性能测试》系列文章中的中篇&#xff0c;主要介绍软件测试工作中常用的一些接口测试工具。 一、接口都有哪些类型&#xff1f; 1、接口一般分为两种&#xff1a; 1.程序内部的接口 2.系统对外的接口 程序内部的接口 方法与方法之间&#xff0c;模…

最靠谱的nvm安装教程 for mac

nvm是node 版本管理工具 一、前提 1、保证自己的mac电脑上没安装node环境 2、保证自己的电脑上有安装git&#xff0c;不然下载nvm时会报错。 git下载可以参考&#xff1a; 1&#xff09;佛系安装&#xff1a;通过提示下载 XCode 2&#xff09;brem安装 3&#xff09;终极大法&…

Kubernetes - 一键安装部署 K8S(附:Kubernetes Dashboard)

问题描述 不知道大伙是如何安装 K8s&#xff0c;特别还是集群的时候&#xff0c;我上一次安装搭建的时候&#xff0c;那个恶心到我了&#xff0c;真的是一步一个脚印走完整个搭建流程&#xff0c;爬了不少坑。 于是&#xff0c;才有了今天的文章&#xff0c;到底有没有可以一…

在mybatis的xml中使用枚举来做判断条件

1.枚举类 import com.baomidou.mybatisplus.annotation.IEnum; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import com.shinkeer.common.utils.StringUtils;import java.util.HashMap; import java.util.Map;…

日志logback详解

该篇博客是我参考了很多博客总结出来的&#xff0c;内容很多&#xff0c;你能看完不睡着算你厉害&#xff01; 一、日志框架发展史 二、日志规范 三、日志级别 四、Logback 4.1 Maven引入 4.2 logback-spring.xml是在哪里加载的&#xff1f; 4.3 logback.xml和logback-s…

err -110 while initial SD card failed enmmm否系解决方案

1.情况表述 之前把 sd卡从小容量换成了大容量 且运行正常 过了一两个月 发现启动失败 报错&#xff1a;mmc0: error -110 whilst initialising SD card 给出报错图片 2.相关解决方案 给出链接 讲的很有道理&#xff0c;但是 我在bash中没有找到对应内核的驱动文件 SD卡…

抖音SEO优化怎么做?详细的方法来了,搭配批量剪辑让效果更优

抖音作为一个非常受欢迎的短视频平台&#xff0c;无论是用户还是内容创作者&#xff0c;体量都越来越大&#xff0c;这意味着竞争也越来越大&#xff0c;想要在抖音上获得更多的曝光和关注&#xff0c;做好抖音 SEO 优化是一门必修课。 抖音 SEO 优化是指优化我们发布到抖音平…

AMEYA360:瑞萨电子转矩控制解决方案加强工业自动化

随着科技的不断进步和全球制造业的竞争加剧&#xff0c;越来越多的企业开始投资和采用自动化技术&#xff0c;以提高生产效率、降低成本、改善产品质量并确保过程安全。而为协同工作完成复杂任务&#xff0c;确保高质量的生产结果。工业自动化设备对精度控制要求非常高&#xf…

Redis底层核心数据结构详解

文章目录 一、深入String&#xff08;SDS&#xff09;1. 字符串简介2. SDS存在的意义3. SDS结构设计4. SDS与C字符串的区别4.1 常数复杂度获取字符串长度4.2 杜绝缓冲区溢出4.3 二进制安全4.4 SDS API 5 小结 二、深入List (QuickList)1. 链表节点结构设计2. Redis的链表实现的…

linux驱动开发led绑定亮灯

head.h 应用程序 驱动程序 结果

LabVIEW基于机器视觉的钢轨表面缺陷检测系统

LabVIEW基于机器视觉的钢轨表面缺陷检测系统 机器视觉检测技术和LabVIEW软件程序&#xff0c;可以实现轨道工件的表面质量。CMOS彩色工业相机采集的图像通过图像预处理、图像阈值分割、形态分析、特征定位和图案匹配进行处理和分析。图形显示界面采用LabVIEW软件编程设计&…

【大模型的一些基本结论】

这里写自定义目录标题 LLama的一些基本结论 各个论文中给出一些观察显现&#xff0c;我们比摘要更简略地摘要一些文本大模型大佬地基本结论和观察到的现象 LLama的一些基本结论 由于大模型要作为服务&#xff0c;因而推理时间更重要。一个较小的、训练时间较长的模型最终会在…

GLIP,FLIP论文阅读

Scaling Language-Image Pre-training via Masking&#xff08;FLIP&#xff0c;2023&#xff09;&#x1f44d; 贡献&#xff1a; 1.图像端引入MAE的随机MASK&#xff0c;image encoder只处理未mask的patches&#xff08;和之前的MAE方法一致&#xff09;&#xff0c;减少了输…

5年经验之谈 —— 手把手教你接口性能测试之JMeter性能测试篇!

本文是我们《手把手教你接口性能测试》系列文章中的完结篇&#xff0c;介绍如何使用JMeter工具进行接口测试和并发测试。 一、Jmeter 简介 Jmeter是由Apache公司开发的一个纯Java开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试&#xff0c;具备高移植性和扩展…

QUIC协议包头保护(四)

一&#xff1a;为什么要有包头保护 学过HTTP和HTTPS都知道&#xff0c;随着网络的普及&#xff0c;人们对于信息的保护&#xff0c;个人的隐私越发的重视。信息加密对于未来协议的发展肯定是越来越趋于严格。QUIC作为新生代的协议&#xff0c;必然要站着前辈的肩膀上发展&#…