• 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)
    }
    
    
  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第三章Databases and Database Files(2)
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(4)
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(1)
    《Microsoft Sql server 2008 Internals》读书笔记第三章Databases and Database Files(1)
    转载:Windows Azure Web Sites VS Web Role
    jQuery 的 ready 函数是如何工作的?
    什么是相关性以及为什么需要初始化它?
    云中漫步 2:使用 VS2012 与 Windows Azure Web 站点创建并发布 ASP.NET Web 应用程序
    转载:Window Azure 中的Web Role详解
    mybatis.net 5 嵌入资源与引用资源
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/15308371.html
Copyright © 2020-2023  润新知