侧边栏壁纸
博主头像
梦幻世界博主等级

行动起来,活在当下

  • 累计撰写 23 篇文章
  • 累计创建 2 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

DAY10:字符串函数;时间函数;内置函数;异常处理

梦幻世界
2024-05-24 / 0 评论 / 0 点赞 / 47 阅读 / 10235 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-05-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

字符串函数

常用方法

  1. 统计字符串的长度,按字节len(str)

  2. 字符串遍历,同时处理有中文的问题

  3. 字符串转整数

  4. 整数转字符串

  5. 字符串 转 []byte

  6. []byte 转字符串

  7. 10 进制转 2, 8, 16 进制

  8. 查找子串是否在指定的字符串中

  9. 统计一个字符串有几个指定的子串

  10. 不区分大小写的字符串比较(== 是区分字母大小写的

  11. 返回子串在字符串第一次出现的 index 值,如果没有返回-1

  12. 返回子串在字符串最后一次出现的 index,如没有返回-1

  13. 将指定的子串替换成 另外一个子串, n 可以指定你希望替换几个,如果 n=-1 表示全部替换

  14. 按 照 指 定 的 某 个 字 符 , 为 分 割 标 识 , 将 一 个 字 符 串 拆 分 成 字 符 串 数 组

  15. 将字符串的字母进行大小写的转换

  16. 将字符串左右两边的空格去掉

  17. 将字符串左右两边指定的字符去掉

  18. 将字符串左边指定的字符去掉

  19. 将字符串右边指定的字符去掉

  20. 判断字符串是否以指定的字符串开头

  21. 判断字符串是否以指定的字符串结束

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// 统计字符串的长度
	// go编码是utf-8 英文字母占一个字节,一个汉字占三个字节
	str := "hello北"
	fmt.Println("str len = ", len(str))

	// 遍历字符串,同时处理中文乱码问题
	r := []rune(str)
	for i := 0; i < len(r); i++ {
		fmt.Printf("字符便利%c \n", r[i])
	}

	// 字符串转整数
	// Atoi是ParseInt(s, 10, 0)的简写
	//n, err := strconv.Atoi("hello")
	n, err := strconv.Atoi("12")
	if err != nil {
		fmt.Println("转换错误", err)
	} else {
		fmt.Println("转换结果", n)
	}

	// 整数转字符串
	// Itoa是FormatInt(i, 10) 的简写。
	numStr := strconv.Itoa(1)
	fmt.Println("整数传唤字符串", numStr)

	// 字符串 转 []byte
	var bytes = []byte("hello byte")
	fmt.Printf("byte %v \n", bytes)

	// []byte 转 字符串
	byteStr := string([]byte{97, 96, 98})
	fmt.Printf("str %v \n", byteStr)

	// 10 进制转 2, 8, 16 进制,也可以进行整数转10进制的字符串
	str2 := strconv.FormatInt(123, 2)
	fmt.Println("10进制转2进制", str2)
	str8 := strconv.FormatInt(123, 8)
	fmt.Println("10进制转8进制", str8)

	// 查找子串是否在指定的字符串中
	con := strings.Contains(str, "ll")
	fmt.Println("是否存在", con)
	// 统计一个字符串有几个指定的子串
	cou := strings.Count(str, "l")
	fmt.Println("一共有几个l", cou)
	// 不区分大小写的字符串比较
	fmt.Println("是否相等", strings.EqualFold("hr", "HR"))
	// 返回子串在字符串第一次出现的 index 值,如果没有返回-1
	fmt.Println("返回第一次出现的index", strings.Index(str, "h"))
	// 返回子串在字符串最后一次出现的 index,如没有返回-1
	fmt.Println("返回最后一次出现的index", strings.LastIndex(str, "l"))
	// 将指定的子串替换成 另外一个子串 n 可以指定你希望替换几个,如果 n=-1 表示全部替换
	rep := strings.Replace("hello", "l", "e", -1)
	fmt.Println("替换后的值", rep)
	// 按 照 指 定 的 某 个 字 符 , 为 分 割 标 识 , 将 一 个 字 符 串 拆 分 成 字 符 串 数 组
	strArr := strings.Split("hello,word你", "w")
	for i := 0; i < len(strArr); i++ {
		fmt.Printf("遍历str[%v]=%v \n", i, strArr[i])
	}
	// 将字符串的字母进行大小写的转换
	str3 := " Hello "
	lower := strings.ToLower(str3) // 小写
	upper := strings.ToUpper(str3) // 大写
	fmt.Printf("小写=%v;大写=%v \n", lower, upper)

	// 将字符串左右两边的空格去掉
	space := strings.TrimSpace(str3)
	fmt.Println(space)
	// 将字符串左右两边指定的字符去掉
	str4 := "!wwww!"
	fmt.Println("替换指定字符串", strings.Trim(str4, "!"))
	// 将字符串左边指定的字符去掉
	fmt.Println("替换左边", strings.TrimLeft(str4, "!"))
	// 将字符串右边指定的字符去
	fmt.Println("替换右边", strings.TrimRight(str4, "!"))
	// 判断字符串是否以指定的字符串开头
	prefix := strings.HasPrefix(str4, "!")
	fmt.Println("左边开头", prefix)
	suffix := strings.HasSuffix(str4, "w")
	fmt.Println("右边开头", suffix)
	
}

时间函数

常用方法

  1. 获取当前时间

  2. 获取时间的其他信息

  3. 格式化日期时间

  4. "2006/01/02 15:04:05" 这个字符串的各个数字是固定的,必须是这样写。

  5. "2006/01/02 15:04:05" 这个字符串各个数字可以自由的组合,这样可以按程序需求来返回时间

  6. Unix将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)

  7. UnixNano将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位纳秒)。如果纳秒为单位的unix时间超出了int64能表示的范围,结果是未定义的。注意这就意味着Time零值调用UnixNano方法的话,结果是未定义的。

package main

import (
	"fmt"
	"time"
)

func main() {
	// 获取当前时间
	now := time.Now()
	fmt.Printf("now = %v; type = %T \n", now, 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())
	fmt.Printf("时=%v\n", now.Hour())
	fmt.Printf("分=%v\n", now.Minute())
	fmt.Printf("秒=%v\n", now.Second())
	// 格式化日期时间 方式1 使用 Printf 或者 SPrintf
	fmt.Printf("当前时间%d-%d-%d %d:%d:%d", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
	sprintf := fmt.Sprintf("当前时间%d-%d-%d %d:%d:%d", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
	fmt.Println("\n", sprintf)
	// 格式化日期时间 方式2 使用 time.Format() 方法完成
	fmt.Println(now.Format("2006-01-02 15:04:05"))
	fmt.Println(now.Format("2006-01-02"))
	fmt.Println(now.Format("15:04:05"))
	// 获取当前时间戳
	fmt.Println("时间戳", now.Unix())
	// 获取当前时间戳纳秒
	fmt.Println("时间戳", now.UnixNano())
}

时间常量

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)

练习:

每隔0.1秒打印一个数字,直到20结束

package main

import (
	"fmt"
	"time"
)

func main() {
	var count = 0
	for true {
		fmt.Println(count)
		count++
		time.Sleep(time.Millisecond * 100)
		if count > 20 {
			return
		}
	}
}

练习

编写一段代码来统计 函数 test03 执行的时间

package main

import (
	"fmt"
	"strconv"
	"time"
)

func test3() {
	str := "hello"

	for i := 0; i < 100000; i++ {
		str += strconv.Itoa(i)
	}
}

func main() {
	startTime := time.Now().Unix()
	test3()
	endTime := time.Now().Unix()
	fmt.Println("test3()执行时间", endTime-startTime)
}

内置函数

基本说明

Golang 设计者为了编程方便,提供了一些函数,这些函数可以直接使用,我们称为 Go 的内置函数。

文档:https://studygolang.com/pkgdoc -> builtin

常用方法

  1. len:用来求长度,比如 string、array、slice、map、channel

  2. new:用来分配内存,主要用来分配值类型,比如 int、float32,struct...返回的是指针

  3. make:用来分配内存,主要用来分配引用类型,比如 channel、map、slice

package main

import "fmt"

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

	num2 := new(int)
	fmt.Printf("num2的类型=%T;num2的值=%v;num2的地址=%v;num2这个指针执行的值%v \n", num2, num2, &num2, *num2)
}

内存分析图

异常处理

基本介绍

  1. Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理。

  2. Go 中引入的处理方式为:defer, panic, recover

  3. 这几个异常的使用场景可以这么简单描述:Go 中可以抛出一个 panic 的异常,然后在 defer 中通过 recover 捕获这个异常,然后正常处理

使用defer+recover 来处理错误

package main

import "fmt"

func test() {

	defer func() {
		err := recover() // 使用recover()内置函数 捕获异常
		if err != nil {
			fmt.Println("err=", err)
		}
	}()

	num1 := 10
	num2 := 0
	num3 := num1 / num2
	fmt.Println("num3=", num3)
}

func main() {
	test()
	fmt.Println("这里执行了")
}

自定义异常errors.New 和 panic

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

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

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

package main

import (
	"errors"
	"fmt"
	"strings"
)

func errTest(name string) error {
	if strings.EqualFold(name, "init") {
		return nil
	} else {
		// 返回一个自定义错误
		return errors.New("名称错误")
	}
}

func test1(name string) {
	err := errTest(name)
	if err != nil {
		// 这里出现错误,程序就终止了
		panic(err)
	}
	fmt.Println("test1后面执行了")
}

func main() {
	test1("in")
	fmt.Println("main后面执行了")
}

0

评论区