一些常用的东西(从下往上看)
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)
}