Skip to content

Latest commit

 

History

History
466 lines (401 loc) · 8.37 KB

go.md

File metadata and controls

466 lines (401 loc) · 8.37 KB

go日记

//当前程序的包名
package main

//导入的包
import (
	"fmt"
	//"os"
	"time"
	//"math"
	//"sort"
)

//显式类型定义,全局
const number int = 30
const (
	userName = "admin"
	address string = "中关村"
	age = "30"
)

//全局变量
//var address string = "北京中关村"
var (
	userType = 1
	userFromTitle = "未知来源"
)

//一般类型全局变量
type names int8
type (
	newType int
	type1 float32
	type2 string
	type3 byte
)

//结构体声明
type comms struct {
	pak string
	num int
}

type persons struct {
	comms //嵌入结构体
	userName string
	age int
}

//接口声明
type golangs interface{}

//构造函数,init 函数也经常被用在当一个程序开始之前调用后台执行的 goroutine,如下面这个例子当中的 backend():
func init() {
	//fmt.Println("我是构造函数")
}


func main() {

	//调用函数
	//echoShow()
	//foreachs()
	//sliceDemo()
	//mapDemo()
	//functions()
	//structDemo()
	//time.Sleep(2 * time.Second) //暂停2秒

	time.Sleep(1 * time.Second)
	

	//并发
	c := make(chan bool)
	go func() {
		fmt.Println("A")
		c 整数
	//var c string = "100"
	//d := strconv.Atoi(c)

	/*
	 //整数:
	 int8(-128 -> 127)
	 int16(-32768 -> 32767)
	 int32(-2,147,483,648 -> 2,147,483,647)
	 int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)
	 //无符号整数:
	 uint8(0 -> 255)
	 uint16(0 -> 65,535)
	 uint32(0 -> 4,294,967,295)
	 uint64(0 -> 18,446,744,073,709,551,615)
	 //浮点型(IEEE-754 标准):
	 float32(+- 1e-45 -> +- 3.4 * 1e38)
	 float64(+- 5 * 1e-324 -> 107 * 1e308)
	 //赋值
	 var b2 int32
	 var n int16 = 34
	*/
}

//变量
func variate() {
	/*
		 var a,b,c int = 1,3,4
		 a,b,c := 1,2,3

			 var x, y *int
			 var xxx, yyy, zzz int
			 var address string = "北京中关村"
			 var num int
			 var aa bool = false
			 var (
			 aaaa int
			 bbbb bool
			 strs string = "这是变量"
			 )
	*/
}

//数组
func array() {
	//数组
	//a := [3]int{1, 2} //长度不足3个元素时后面用0不足
	//fmt.Println(a)

	//b := [20]int{19: 8} //将8放到最后一位
	//fmt.Println(b)

	//c := [...]int{1, 2, 34, 5} //已经知道数组长度
	//fmt.Println(c)
	//fmt.Println(c[3]) //获取某一个元素

	//d := [...]int{999: 88} //第100个元素为88
	//fmt.Println(d)

	//数组指针
	//e := [...]int{99: 1}
	//var p *[100]int = &e
	//fmt.Println(p)

	//二维数组,下面是 包含了两个元素,每个元素的长度为3个
	/*f := [2][3]int{
	 {1, 2, 3},
	 {4, 5, 6}}
	 fmt.Println(f)
	 fmt.Println(f[1][2])
	*/

	//字符串数组,用法与整数一样
	g := [3]string{"AAA", "BBB", "CCC"}
	fmt.Println(g)

	//s3 := []string{"a", "A"}
	//fmt.Println(s3)

	//s4 := []string{'a','b','c'}
	//fmt.Println(s4)

	//s5 := [...]string{'a','b','c'}
	//fmt.Println(s5)

	//冒泡排序
	arr := [...]int{21, 36, 76, 2, 5, 9, 435}
	num := len(arr)
	fmt.Println(arr)

	for i := 0; i arr[i] {
				tmp := arr[j]
				arr[j] = arr[i]
				arr[i] = tmp
			}
		}
	}
	fmt.Println(arr)
}

//切片 slice
func sliceDemo() {
	//定义一个切片
	//var a []int
	//fmt.Println(a)

	/*b := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	//fmt.Println(b) //[1 2 3 4 5 6 7 8 9 10]
	//取区间的数据
	c := b[5:10]
	fmt.Println(c) //[6 7 8 9 10]
	d := b[3:]
	fmt.Println(d) //[4 5 6 7 8 9 10]
	e := b[:7]
	fmt.Println(e) //[1 2 3 4 5 6 7]
	*/

	//类型,包含的元素,存储容量 ,但容量不够时,容量会自动翻倍增加,容量可以不设置,但为了效率,可根据情况设置
	//s1 := make([]int, 3, 10) //slice的整型数组,3个元素,slice的初始容量:长度为10
	//分别打印:长度,容量,值
	//fmt.Println(len(s1), cap(s1), s1) //3 10 [0 0 0]

	//s2 := []byte{'a', 'b', 'c', 'd', 'e', 'f', '/', 'A', 'B'}
	//fmt.Println(s2) //这里打印的是acsll码 ,[97 98 99 100 101 102]
	//fmt.Println(s2[5:])
	//fmt.Println(string(s2)) //转换为字符串,abcdef/
	//s3 := []string{"a", "A"}
	//fmt.Println(s3)

	//切片增加元素
	//s4 := make([]int, 3, 6)
	//fmt.Println(len(s4), cap(s4)) // 3,6
	//s4切片增加元素
	//s4 = append(s4, 43, 435, 634, 53535)
	//fmt.Println(len(s4), cap(s4), s4) //7 12 [0 0 0 43 435 634 53535]

}

//map 的使用
func mapDemo() {
	//map 01
	//var a map[int]string
	// a = map[int]string{} 或者 a = make(map[int]string)

	// map 02
	// a := make(map[int]string)

	//map 03,键未整数,值为字符串
	//a := map[int]string{}
	// 键、值都为字符串
	//a1 := map[string]string{}

	//赋值
	/*a[1] = "ok"
	a[2] = "AAA"
	m := a[1]
	fmt.Println(a) // map[1:ok]
	fmt.Println(m) // ok
	//删除指定元素
	delete(a, 2)
	fmt.Println(a)*/

	/*
		sm := make([]map[int]string, 5)
		//fmt.Println(sm) //[map[] map[] map[] map[] map[]]
		//初始化map ,key=>value
		for k, _ := range sm {
			sm[k] = make(map[int]string, 1)
			sm[k][1] = "测试赋值"
			fmt.Println(sm[k])
		}
		fmt.Println(sm)*/
	/*
		sm2 := make([]map[int]string, 5)
		for k, v := range sm2 {
			//sm2[k] = make(map[int]string, 1)
			//sm2[k][1] = "测试赋值"
			fmt.Println(k)
			fmt.Println(v)
		}
		fmt.Println(sm2)
	*/

	/*
		sm3 := make([]map[int]string, 5)
		for i := range sm3 {
			sm3[i] = make(map[int]string, 1)
			sm3[i][1] = "测试赋值"
		}
		fmt.Println(sm3) //[map[1:测试赋值] map[1:测试赋值] map[1:测试赋值] map[1:测试赋值] map[1:测试赋值]]
	*/

	//间接排序(按key排序),map是无序性,需要导入soft包
	/*
		m := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
		s := make([]int, len(m))
		i := 0
		for k, _ := range m {
			s[i] = k
			i++
		}
		sort.Ints(s)
		fmt.Println(s)
	*/

	/*
		m1 := map[int]string{1: "a", 2: "b", 3: "c"}
		//将m1转换为如下:
		//newret := map[string]int{"a": 1, "b": 2, "c": 3}
		m2 := make(map[string]int)
		for k, v := range m1 {
			m2[v] = k
		}
		fmt.Println(m1)
		fmt.Println(m2)
	*/
}

//循环
func foreachs() {
	//普通循环
	for i := 0; i 3 {
			break
		}
		//跳出本次循环
		if i == 2 {
			continue
		}
		fmt.Printf("This is the %d iteration\n", i)
	}

}

//if判断
func ifDemo() {
	var isbool = 9
	if isbool == 1 {
		print("1")
	} else if isbool == 2 {
		print("2")
	} else if isbool > 3 && isbool 1 {
		fmt.Println("AAA")
	} else if b > 3 {
		fmt.Println("BBB")
	}
	// ps 这里的 a,b赋值只能在if判断语句中使用,无法在if之外使用,switch也是如此

}

//switch分之判断
func switchDemo() {
	//demo 1
	var snum int = 2
	switch snum {
	case 1:
		print("1111")
	case 2:
		print("2222")
	default:
		print("未知")
	}

	//demo2
	var num int = 5
	switch {
	case num == 1:
		print("num==1")
	case num >= 3:
		print("num==3")
	default:
		print("未知")
	}
}

//Break、continue、lable、goto的使用
// lable 跳出代码块
// goto 调整执行位置,然后继续执行
func bclg() {
	/*
			//lable使用
		LABLE1:
			for {
				for i := 0; i 3 {
						//这里的break会永远循环下去,因为外层是一个无限循环
						//break
						//这里会跳出两个循环,执行后面的代码
						break LABLE1
					}
				}
			}
	*/
	//goto使用
	for {
		for i := 0; i 3 {
				//这里的break会永远循环下去,因为外层是一个无限循环
				//break
				//这里会跳出两个循环,执行后面的代码
				goto LABLE1
			}
		}
	}
LABLE1:
}

//函数的使用
func functions() {
	//print("开始调用函数\n")
	//A(8, "test")
	deferDemo()

}

//带参数函数
func A(a int, b string) {
	fmt.Println(a)
	fmt.Println(b)
}

//带返回值,返回一个整数
func B(a int, b string) int {
	fmt.Println(a)
	fmt.Println(b)
	return 1
}

//返回多个
func C(a int, b int) (string, int) {
	fmt.Println(a)
	fmt.Println(b)
	return "A", 1
}

func D() (a, b, c int) {
	a, b, c = 1, 2, 3 //上面已经初始化,不需要 var或者:了
	return //这里会自动返回a,b,c参数值,也可以写为:return a,b,c
}

//不确定参数,这里就可以传入多个参数
func E(a ...int) {
	print(a)
}
func F(a ...string) {
	print(a)
}
func G(a []int) {

}

//传递指针类型
func H(a *int) {
	*a = 2
	fmt.Println(*a)
}

//defer的使用,go没有try异常处理,
func deferDemo() {
	//panic("B")
	defer fmt.Println("A")
}

//结构体的使用
func structDemo() {
	/*a := persons{}
	//赋值
	a.userName = "张三"
	a.age = 30
	fmt.Println(a)
	*/

	//更简洁的赋值
	/*b := persons{
		userName: "admin",
		age: 30,
	}
	fmt.Println(b)*/

	//匿名结构体
	/*c := struct {
		number int
		address string
	}{
		number: 10086,
		address: "中关村",
	}
	fmt.Println(c.address)
	
}