当前位置: 首页 > 工具软件 > Ciao-Go > 使用案例 >

go 语言学习记录2

史烈
2023-12-01
  • string切分
//把str字符串按空格进行分割,并返回一个slice
str := "string one two stree"
	sl := strings.Fields(str)
//切分完成后进行for循环读取其中的数据
/**
		for 循环示例
		range为关键字  得到的是下标和值
		因为下面代码不需要下标  所以用`_`进行了接收
		如果需要使用下标 可以将 `_` 替换成 i

	*/
	for _, val := range sl {
		fmt.Println(val)
	}
	/**
		strings.TrimSpace(s) 来剔除字符串开头和结尾的空白符号
		Join 用于将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串:
		strings.Join(sl []string, sep string) string

		strconv 是类型转换类  任何类型都可以转换成为 String 但是string转换成
		其他参数不是一定可以的
		返回的格式 :val, err = strconv.Atoi(s)
	*/
	int_str := strconv.IntSize
	fmt.Println(int_str)

unicode 包含了一些针对测试字符的非常有用的函数(其中 ch 代表字符):
判断是否为字母:unicode.IsLetter(ch)
判断是否为数字:unicode.IsDigit(ch)
判断是否为空白符号:unicode.IsSpace(ch)

  • 时间和日期(time包)

time.Now().Format(‘2018-12-07’)
把当前时间转换为format里面传入的格式
如果需要在应用程序在经过一定时间或周期执行某项任务(事件处理的特例),
则可以使用 time.After 或者 time.Ticker:
另外,time.Sleep(Duration d) 可以实现对某个进程(实质上是 goroutine)时长
为 d 的暂停。

	t := time.Now()
	fmt.Println(t) // e.g. Wed Dec 21 09:52:14 +0100 RST 2011
	fmt.Printf("%02d.%02d.%4d\n", t.Day(), t.Month(), t.Year())
	// 21.12.2011
	t = time.Now().UTC()
	fmt.Println(t) // Wed Dec 21 08:52:14 +0000 UTC 2011
	fmt.Println(time.Now()) // Wed Dec 21 09:52:14 +0100 RST 2011
	// calculating times:
	week := 60 * 60 * 24 * 7 * 1e9 // must be in nanosec
	week_from_now := t.Add(time.Duration(week))
	fmt.Println(week_from_now) // Wed Dec 28 08:52:14 +0000 UTC 2011
	// formatting times:
	fmt.Println(t.Format(time.RFC822)) // 21 Dec 11 0852 UTC
	fmt.Println(t.Format(time.ANSIC)) // Wed Dec 21 08:56:34 2011
	fmt.Println(t.Format("02 Jan 2006 15:04")) // 21 Dec 2011 08:52
	s := t.Format("20060102")
	fmt.Println(t, "=>", s)
  • 指针

可以控制数据结构的指针 但是不能进行指针运算
go语言存取地址符是 & 放到一个变量前使用就会返回相应变量的内存地址
地址可以存储在一个叫做指针的特殊数据类型中
(指针的格式化标识符为 %p)
一个指针变量可以指向任何一个值的内存地址 它指向那个值的内存地址
使用一个指针引用一个值被称为间接引用
一个指针变量通常缩写为 ptr。
对于任何一个变量 var, 如下表达式都是正确的:var == *(&var)。
改变指针中的值时 原对象的值也会改变 因为他们两个指向同一个地址
注意
不能得到一个文字或常量的地址
对一个空指针的反向引用是不合法的,并且会使程序崩溃

	var i1 = 5
	fmt.Printf("An integer: %d, it's location in memory: %p\n", i1, &i1)
	var intP *int //声明指针变量 //
	intP = &i1
	fmt.Println( *intP) //获取指针中的类容

	//改变指针中的值时 原对象的值也会改变  因为他们两个指向同一个地址
	sts := "good bye"
	var p *string = &sts
	*p = "ciao"
	fmt.Printf("Here is the pointer p: %p\n", p) // prints address
	fmt.Printf("Here is the string *p: %s\n", *p) // prints string
	fmt.Printf("Here is the string s: %s\n", sts) // prints same string
  • 结构判断

关键字 if 和 else 之后的左大括号 {
必须和关键字在同一行,如果你使用了 else-if 结构,则前段代码块的右大括号
} 必须和 else-if 关键字在同一行。
这两条规则都是被编译器强制规定的。
非法代码
if x{
}
else { // 无效的
}
当 if 结构内有 break、continue、goto 或者 return 语句时 Go 代码的常见写法是省略 else 部分

//判断语句 这里不需要使用 if bool1 == true 来判断,因为 bool1 本身已经是一个布尔类型的值
	bool1 := true
	if bool1 {
		fmt.Printf("The value is true\n")
	} else {
		fmt.Printf("The value is false\n")
	}
	i,err := testStrToInt("aa")
	if err != nil {
		println(err)
	}else {
		println(i)
	}

switch结构
变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。
类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号 { 必须和 switch 关键字在同一行。
可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3
如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的。

var num1 int = 100
	switch num1 {
	case 98, 99:
		fmt.Println("It's equal to 98")
	case 100:
		fmt.Println("It's equal to 100")
	default:
		fmt.Println("It's not equal to 98 or 100")
	}

switch 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 true),
然后在每个 case 分支中进行测试不同的条件。当任一分支的测试结果为 true 时,
该分支的代码会被执行。这看起来非常像链式的 if-else 语句,但是在测试条件非常多的情况下,提供了可读性更好的书写方式。

	switch {
	case i < 0:
		//代码块1
	case i == 0:
		//代码块2
	case i > 0:
		//代码块3
	}
 类似资料: