189. go学习1

一些常用的东西(从下往上看)

package main

import (
	"errors"
	"fmt"
	"math/rand"
	"strconv"
	"time"
	"unsafe"
)

func test1() {
	var a int = 999
	fmt.Println(a)
	var b uint = 1
	var c byte = 255
	var d rune = 10 // run 等价于int32
	fmt.Println(b, c, d)
}

func test2() {
	var str string = "hello 北京"
	for i := 0; i < len(str); i++ {
		fmt.Printf("str[%d]=%c
", i, str[i]) // 按照字节遍历, 到中文时乱码
	}
	/*
		str[0]=h
		str[1]=e
		str[2]=l
		str[3]=l
		str[4]=o
		str[5]=
		str[6]=å
		str[7]=
		str[8]=
		str[9]=ä
		str[10]=º
		str[11]=¬
	*/
	for i, c := range str {
		fmt.Printf("str[%d]=%c
", i, c) // 按照字符遍历, 可以遍历中文(可以发现中文占用三个字节, 但是下标不确定了不好)
	}
	/*
		str[0]=h
		str[1]=e
		str[2]=l
		str[3]=l
		str[4]=o
		str[5]=
		str[6]=北
		str[9]=京
	*/
	str2 := []rune(str)
	for i := 0; i < len(str2); i++ {
		fmt.Printf("str[%d]=%c
", i, str2[i]) // 强转rune类型, 按照字节划分
	}
	/*
		str[0]=h
		str[1]=e
		str[2]=l
		str[3]=l
		str[4]=o
		str[5]=
		str[6]=北
		str[7]=京
	*/
}

func test3() {
	var n1 = 100
	fmt.Printf("n1的类型时%T
", n1)
}

func test4() {
	var n2 int64 = 10
	fmt.Printf("n2的类型是 %T, n2占用的字节数是 %d
", n2, unsafe.Sizeof(n2))
}

func test5() {
	var age byte = 90
	fmt.Println(age)
}

func test6() {
	var c1 byte = 'a'
	var c2 byte = '0'
	fmt.Println("c1=", c1)
	fmt.Println("c2=", c2)

	fmt.Printf("c1=%c c2=%c
", c1, c2)
	var c3 int = '被'
	fmt.Printf("c3=%c c3对应码值为=%d
", c3, c3) // 输出码值以及对应的数字

	var c4 int = 22269
	fmt.Printf("c4=%c
", c4) // 输出码值

	var n1 = 10 + 'a'
	fmt.Printf("n1=%c %d
", n1, n1) // 码值以及数值类型
}

func test7() {
	var b = false
	fmt.Println("b=", b)
	fmt.Println("b 占用的空间 = ", unsafe.Sizeof(b)) // bool值占用一个字节
}

func test8() {
	var i int32 = 100
	var n1 float32 = float32(i)
	var n2 int8 = int8(i)
	var n3 int64 = int64(i)
	fmt.Printf("i=%v n1=%v n2=%v n3=%v", i, n1, n2, n3) // 打印值
}

func test9() {
	var num1 int = 99
	var num2 float64 = 23.456
	var b bool = true
	var myChar byte = 'h'
	var str string

	str = fmt.Sprintf("%d", num1)
	fmt.Printf("str type %T str=%q 
", str, str)

	str = fmt.Sprintf("%f", num2)
	fmt.Printf("str type %T str=%q 
", str, str)

	str = fmt.Sprintf("%t", b)
	fmt.Printf("str type %T str=%q 
", str, str)

	str = fmt.Sprintf("%d", myChar)
	fmt.Printf("str type %T str=%q 
", str, str)

	/*
		str type string str="99"
		str type string str="%!d(float64=23.456)"
		str type string str="%!d(bool=true)"
		str type string str="104
	*/
	fmt.Println()

	str = strconv.FormatInt(int64(num1), 10)
	fmt.Printf("str type %T str=%q 
", str, str)

	str = strconv.FormatFloat(num2, 'f', 10, 64)
	fmt.Printf("str type %T str=%q 
", str, str)

	str = strconv.FormatBool(b)
	fmt.Printf("str type %T str=%q 
", str, str)

	str = strconv.Itoa(num1)
	fmt.Printf("str type %T str=%q 
", str, str)

}

func test10() {
	var str string = "true"
	var b bool
	b, _ = strconv.ParseBool(str)
	fmt.Printf("b byte %T b=%v
", b, b)

	var str2 string = "1234567"
	var n1 int64
	var n2 int
	n1, _ = strconv.ParseInt(str2, 10, 64)
	n2 = int(n1)
	fmt.Printf("n1 type %T n1=%v
", n1, n1)
	fmt.Printf("n1 type %T n1=%v
", n2, n2)

	var str3 string = "123.456"
	var f1 float64
	f1, _ = strconv.ParseFloat(str3, 64)
	fmt.Printf("f1 type %T f1=%v
", f1, f1)

	var str4 string = "hello"
	var n3 int64 = 11
	n3, _ = strconv.ParseInt(str4, 10, 64)
	fmt.Printf("n3 type %T n3=%v
", n3, n3) // 如果类型不能装换,会转换成默认值(int 默认值0)
}

func test11() {
	var i int = 10
	fmt.Println("i的地址=", &i) //获取指针类型

	var prt *int = &i // 定义指针类型
	fmt.Printf("prt=%v
", prt)

	fmt.Printf("prt 的地址=%v
", &prt)
	fmt.Printf("prt 指向的值=%v
", *prt) // 获取指针对应的值

	var num int = 9
	fmt.Printf("num address=%v
", num)

	var prt2 *int = &num
	*prt2 = 11
	fmt.Printf("num =%v
", num)

	// var a int = 200
	// var prt3 * int = a  // 必须赋值地址

	// var a int = 300
	// var prt4 *float32 = &a // 类型需对应

	fmt.Println()
	var a int = 300
	var b int = 200
	var prt5 *int
	prt5 = &a
	*prt5 = 91
	prt5 = &b
	*prt5 = 81
	fmt.Printf("a=%d, b=%d, *prt5=%d
", a, b, *prt5)
}

func test12() {
	var name string
	var age byte
	var sal float32
	var isPass bool
	fmt.Println("请输入姓名")
	fmt.Scanln(&name)
	fmt.Println("请输入年龄")
	fmt.Scanln(&age)
	fmt.Println("请输入薪水")
	fmt.Scanln(&sal)
	fmt.Println("请输入是否通过考试")
	fmt.Scanln(&isPass)
	fmt.Printf("名字是%v
,年龄是%v
, 薪水是%v
, 薪水是%v
", name, age, sal, isPass)

	fmt.Println("请输入姓名, 年龄, 薪水, 是否通过考试, 使用空格隔开")
	fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass)
	fmt.Printf("名字是%v
,年龄是%v
, 薪水是%v
, 薪水是%v
", name, age, sal, isPass)

}

func test13() {
	var a int = 1 >> 2  // 0
	var b int = -1 >> 2 // -1
	var c int = 1 << 2  // 4
	var d int = -1 << 2 // -4

	fmt.Println(a, b, c, d)

	fmt.Println(2 & 3)  // 2
	fmt.Println(2 | 3)  // 3
	fmt.Println(13 & 7) // 5
	fmt.Println(5 | 4)  // 5
	fmt.Println(-3 ^ 3) // -2
	/*
		3   0000 0011 源码
			0000 0011 反码
			0000 0011 补码
		-3  1000 0011 源码
		    1111 1100 反码  符号为不变,其他位取反
			1111 1101 补码  反码 +1

		3 ^ -3   使用补码进行异或(不同为1, 相同为0)计算
		   0000 0011 3补码
		   1111 1101 -3补码  反码 +1
		   1111 1110 异或(不同为1, 相同为0)
		   1111 1101 补码反推反码(-1)
		   1000 0010 反码反推源码(符号位不变其他位取反)
		   -2  结果
	*/
}

func test14() {
	fmt.Println("请输入成绩")
	var score float32
	fmt.Scanf("%f", &score)
	fmt.Println(score)
	if score >= 99 {
		fmt.Println("BMW")
	} else if 80 < score && score <= 99 {
		fmt.Println("iphone&plue")
	} else if 60 <= score && score <= 80 {
		fmt.Println("Ipad")
	} else {
		fmt.Println("竹条炒肉")
	}
}

func test15() {
	var n1 int32 = 5
	var n2 int32 = 20
	switch n1 {
	case n2, 10, 5: // case中的类型需要和n1相同
		fmt.Println("ok1")
	case 6:
		fmt.Println("ok2")
	default:
		fmt.Println("没有匹配")

	}

	fmt.Println(n1)
	switch {
	case n1 == n2, n1 == 10, n1 == 5: // 多条件相当于||
		fmt.Println("ok1")
		fallthrough
	case n1 >= 9:
		fmt.Println("ok2") // fallthrough不比较条件直接执行下一个case中的代码
		fallthrough
	default:
		fmt.Println("没有匹配")

	}

	var x interface{}
	var y = 10.0
	x = y
	switch x.(type) { // 类型判断
	case nil:
		fmt.Println("nil类型")
	case int:
		fmt.Println("int 类型")
	case float64:
		fmt.Println("float64类型")
	case bool, string:
		fmt.Println("bool || string")
	case func(int) float64:
		fmt.Println("func(int)")
	default:
		fmt.Println("未知类型")
	}
}

func test16() {
	var totalLevel int = 3
	for i := 1; i <= totalLevel; i++ {
		// 每层的空格数总层数-当前层数
		for j := 0; j < totalLevel-i; j++ {
			fmt.Print(" ")
		}

		// 每层的星号数量为2*层数-1个
		for k := 1; k <= 2*i-1; k++ {
			// 打印空心金字塔,除了第一个和最后一个打印, 特殊情况最后一行需要全部打印
			if k == 1 || k == 2*i-1 || i == totalLevel {
				fmt.Print("*")
			} else {
				fmt.Print(" ")
			}
		}
		// 换行处理
		fmt.Println()
	}
}

func test17() {
	var count int = 0
	for {
		rand.Seed(time.Now().UnixMilli())
		n := rand.Intn(100) + 1
		fmt.Println("n=", n)
		count += 1
		if n == 99 {
			break
		}
	}
	fmt.Println(count)
}

func test18() {
	var money float32 = 100000
	var count int = 0
	for {
		if money > 50000 {
			money -= (money * 0.05)
		} else if money <= 50000 {
			money -= 1000
		}
		if money < 0 {
			break
		}
		fmt.Println(money)
		count++
	}
	fmt.Println(count)
}

func test19() {
	var n int = 30 //演示goto的使用
	fmt.Println("ok1")
	if n > 20 {
		goto label1
	}
	fmt.Println("ok2")
	fmt.Println("ok3")
	fmt.Println("ok4")
label1:
	fmt.Println("ok5")
	fmt.Println("ok6")
	fmt.Println("ok7")
}

func sum(n1, n2 float32) float32 {
	defer fmt.Println("ok1 n1=", n1)
	defer fmt.Println("ok1 n2=", n2)
	n1++
	n2++
	fmt.Printf("n1 type =%T
", n1)
	return n1 + n2
}

func test20() {
	now := time.Now()
	fmt.Printf("now=%v now type=%T
", now, now)
	// 获取部分信息
	fmt.Printf("年=%v
", now.Year())
	fmt.Printf("月=%v
", int(now.Month()))
	fmt.Printf("日=%v
", now.Day())
	fmt.Printf("时=%v
", now.Hour())
	fmt.Printf("分=%v
", now.Minute())
	fmt.Printf("秒=%v
", now.Second())

	// 格式化日期时间1
	fmt.Printf("当前年月日 %d-%d-%d %d:%d:%d
", now.Year(), int(now.Month()), now.Day(),
		now.Hour(), now.Minute(), now.Second())

	dateStr := fmt.Sprintf("当前年月日 %d-%d-%d %d:%d:%d
", now.Year(), int(now.Month()), now.Day(),
		now.Hour(), now.Minute(), now.Second())
	fmt.Printf("datestr=%v
", dateStr)

	// 格式化日期时间1
	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.Format("2006/01/02 15:04:05")) // 里面的时间数字是固定的
	fmt.Println(now.Format("2006/01/02"))
	fmt.Println(now.Format("15:04:05"))

	// 时间常量
	// const (
	// 	Nanosecond  Duration = 1  // 纳秒
	// 	Microsecond          = 1000 * Nanosecond  // 微妙
	// 	Millisecond          = 1000 * Microsecond // 毫秒
	// 	Second               = 1000 * Millisecond // 妙
	// 	Minute               = 60 * Second // 分钟
	// 	Hour                 = 60 * Minute // 小时
	// )
	fmt.Println("-----------")
	fmt.Println("秒:", time.Now().Unix(), "纳秒:", time.Now().UnixNano())
}

func test21() {
	// new:用来分配内存,主要用来分配值类型,比如 int、float32,struct...返回的是指针
	// make:用来分配内存,主要用来分配引用类型,比如 channel、map、slice
	nums := 100
	fmt.Printf("nums的类型%T, nums的值=%v, nums的地址=%v
", nums, nums, nums)

	num2 := new(int) // 返回地址类型, new
	*num2 = 100
	fmt.Printf("num2的类型%T, num2的值=%v, num2的地址=%v
", num2, num2, num2)
}

func test22() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("err=", err)
			// 发送邮件
		}
	}()

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

func test23() {
	err := errors.New("自定义错误") // 方式一
	fmt.Println(err)
	panic("除零异常") // 方式二
}

func main() {
	// test1() // rune类型
	// test2()  // 遍历中文字符串
	// test3()  // 获取值类型
	// test4()  // 如何在程序查看某个变量的字节大小和数据类型
	// test5()  // 字节类型
	// test6()  // 码值
	// test7()  // bool值
	// test8()  // %v使用
	// test9()  // 基本类型转string 类型, strconv
	// test10() // string类型转基本数据类型
	// test11() // 指针类型
	// test12() // 读取键盘输入
	// test13() // 位运算
	// test14() // 条件控制
	// test15() // switch条件控制
	// test16() // 打印金字塔
	// test17() // 生成随机数
	// test18() // break练习
	// test19() // goto练习
	// fmt.Println("sum=", sum(1, 3)) // defer使用
	// test20() // 时间操作
	// test21() // new使用
	// test22() // 异常处理
	test23() // 自定义异常

	// var board = [][]byte{{'o', 'a', 'a', 'n'}, {'e', 't', 'a', 'e'}, {'i', 'h', 'k', 'r'}, {'i', 'f', 'l', 'v'}}
	// var words = []string{"oath", "pea", "eat", "rain"}
	// findWords(board, words)
}

原文地址:https://www.cnblogs.com/liuzhanghao/p/15308371.html