golang发现就很好玩。
很久没有写日志了,继续恢复吧。
- // one project main.go
- package main
- import (
- "errors"
- "fmt"
- "math"
- "os"
- )
- func main() {
- /*
- Go语言基础类型
- 布尔类型:bool
- 整型:int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte,uintptr (一般使用int和unit就好啦)
- 浮点类型:float32,float64
- 复数类型:complex64,complex128
- 字符串:string
- 字符类型:rune
- 错误类型:error
- Go语言复合类型
- 指针 pointer
- 数组 array
- 切片 siice
- 字典 map
- 通道 chan
- 结构体 struct
- 接口 interface
- */
- //声明一个叫v1的int类型变量,默认值为0
- var v1 int
- //声明的变量后就一定要使用(给这个变量赋值不算使用),不然编译的时候就会报错:.\main.go:7: v1 declared and not used
- fmt.Println(v1) //0
- //在声明一个变量的同时初始化
- var v2 int = 10 //最标准的方法
- var v3 = 10 //编译器可以自动推导出v3的类型
- v4 := 10 //使用了:=运算符 编译器可以自动推导出v4的类型 ,推荐使用这种简洁明了的方式
- /*
- :=符号的左边变量不可以被声明过
- var i int
- i := 3
- 会报错:no new variables on left side of :=
- */
- //字符串
- v5 := "大连"
- //数组
- v6 := [2]int{1,2}
- //数组切片
- v7 := []int{0,1,2,3}
- //结构体
- var v8 struct {
- one int
- two int
- }
- //给结构体两个数赋值
- v8.one = 520
- v8.two = 1314
- //指针,获取v1的地址
- var v9 *int = &v1
- //声明key为string,value为int的map
- var v10 map[string]int
- //初始化map
- v10 = make(map[string]int)
- v10["love"] = 1314
- v10["she"] = 1994
- //声明一个函数,参数为一个int,返回为一个int
- var v11 func(a int) int //输出 <nil>
- //使用var关键词连续定义多个变量
- var (
- v12 int
- v13 float32
- v14 float64
- )
- //使用多重赋值交换两数
- i := 6
- j := 9
- i,j = j,i
- fmt.Println(i,j) //9 6
- //使用匿名变量忽略函数多重返回值中的部分
- _,_,nickname := GetName() //_就为匿名变量
- fmt.Println("this nickname is",nickname) //this nickname is Moss
- /*
- 字面量常量(literal),是指程序中硬编码的常量,例如:1126,7.9,true,"xuan"
- */
- //定义常量,常量的右值要为字面量常量或者编译期间预算的常量表达式
- const PI float64 = 3.14159265358979323846
- /*
- 预定义常量
- GO语言预定义了这些常量:true,false,iota
- iota是一个可被编译器修改的常量,在每个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1
- */
- const (
- v15 = iota //iota被重置为0
- v16 = iota // v16 = 1
- v17 = iota // v17 = 2
- )
- //如果两个const的赋值语句的表达式是一样的,那么可以省略后一个赋值表达式
- const (
- v18 = 1 + iota
- v19
- v20
- )
- //布尔类型不能接受其他类型的赋值,不能自动或者强制转换,否则会报错
- //bool test = "peixuan" //Syntax error: unexpected name,expecting semicolon or newline or }
- //int和int32在Go语言里面被认为是两种语言,且不同类型的整型不能进行比较
- /*
- var v21 int32
- v22 := 2014 //v22被自动推断为int类型
- v21 = v22 //cannot use v22 (type int) as type int32 in assignment
- */
- //复数
- var v21 complex64
- v21 = 3.2 + 12i //3.2实部 12虚部
- v22 := 3.3 + 13i
- v23 := complex(3.4,14) //3.4 + 14i
- fmt.Println("实部:",real(v23),"虚部:",imag(v23))
- fmt.Println(v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23)
- //字符串
- v24 := "peixuan,佩璇"
- v25 := v24[0]
- //v24[0] = 'A' //cannot assign to v24[0]
- fmt.Printf("%s:%c\n",v24,v25)
- //遍历字符串
- //以字节数组遍历
- l := len(v24)
- for i := 0; i < l; i++ {
- ch := v24[i]
- fmt.Println(i,ch)
- }
- //以Unicode字符遍历
- //i 是index,ch 是value。
- for i,ch := range v24 {
- fmt.Println(i,ch)
- }
- /*
- 数组是值类型,切片是引用类型
- */
- v26 := [10]int{1,3,4,5,6,7,8,9,10}
- for i,v := range v26 {
- fmt.Println(i,v)
- }
- //根据数组创建数组切片
- v27 := v26[:5] //前五个
- fmt.Println(v27) //[1 2 3 4 5]
- v28 := v26[5:] //从第五个开始到结束
- fmt.Println(v28) //[6 7 8 9 10]
- v29 := v26[3:7] //第三个到第七个
- fmt.Println(v29) //[4 5 6 7]
- v30 := v26[:] //所有数组
- fmt.Println(v30)
- //创建一个初始元素个数为5的数组切片,元素初始值为0,
- v31 := make([]int,5)
- fmt.Println(v31)
- //创建一个初始元素个数为5的数组切片,元素初始值为0,并预留是个元素的存储空间。
- v32 := make([]int,10)
- fmt.Println(v32)
- //直接创建并初始化包含5个元素的数组切片
- v33 := []int{1,5}
- fmt.Println(v33)
- //cap()函数可以获取切片的存储大小,len()可以获取切片中的个数多少
- fmt.Println("cap() is ",cap(v32),"len() is ",len(v32))
- //切片增加元素
- v33 = append(v33,11,12,13,14)
- fmt.Println(v33)
- //切片增加数组
- v33 = append(v33,v32...) //v32...相当于把所有元素拆成单个后当做参数传入
- fmt.Println(v33)
- //map
- //定义lover结构体
- type Lover struct {
- Name string
- BirthDay string
- }
- //声明map变量she
- var she map[string]Lover
- //初始化she
- she = make(map[string]Lover)
- //往she中添加元素
- she["lpx"] = Lover{"liaopeixuan","1994.11.26"}
- //从这个map中查找zyx
- lover1,ok := she["zyx"]
- if ok {
- fmt.Println("you love is ",lover1.Name)
- } else {
- fmt.Println("zyx is not found!")
- }
- //查找lpx
- lover2,ok := she["lpx"]
- if ok {
- fmt.Println("you love is ",lover2.Name)
- } else {
- fmt.Println("lpx is not found!")
- }
- //删除键为"zyx"的键值对,如果改键不存在则不会执行任何东西
- delete(she,"zyx")
- /*
- 流程控制
- 条件语句:if,else, else if
- 选择语句:switch, case, select
- 循环语句:for range
- 跳转语句:goto
- */
- //条件语句
- if 3 > 6 {
- fmt.Println("3 > 6")
- } else if 2 > 6 {
- fmt.Println("2 > 6")
- } else {
- fmt.Println("else")
- }
- //选择语句
- sw := 2
- switch sw {
- case 1:
- fmt.Println("case 1")
- case 2:
- fmt.Println("case 2")
- case 3:
- fallthrough
- case 4:
- fmt.Println("case 4")
- default:
- fmt.Println("default")
- }
- /*
- case后面不需要像C语言一样写breeak防止一直向下执行,只有case中遇见fallthrough才会继续向下执行
- 当sw=1 case 1
- 当sw=2 case 2
- 当sw=3 case 4
- 当sw=4 case 4
- 当sw=5 defalut
- */
- //switch后面的表达式不是必须的
- switch {
- case 1 > 3:
- fmt.Println("1 > 3")
- case 1 < 3:
- fmt.Println("1 < 3")
- }
- //循环语句
- for i := 0; i < 10; i++ {
- fmt.Println(i)
- }
- //for无限循环
- count := 0
- for {
- count++
- if count < 100 {
- continue
- } else if count > 100 {
- fmt.Println("count is ",count)
- break
- }
- }
- JLoop:
- for i := 0; i < 10; i++ {
- fmt.Println("label i is ",i)
- for j := 0; j < 10; j++ {
- if j > 5 {
- //跳到外面去啦,但是不会再进来这个for循环了
- break JLoop
- }
- }
- }
- //跳转语句 goto语句可以跳转到本函数内的某个标签
- gotoCount := 0
- GotoLabel:
- gotoCount++
- if gotoCount < 10 {
- goto GotoLabel //如果小于10的话就跳转到GotoLabel
- }
- myfunc(999,998,997)
- anyfunc(1,"love",3.6)
- //把匿名函数赋值给一个变量
- f := func(str string) {
- fmt.Println(str)
- }
- f("i love peixuan")
- //立刻执行匿名函数
- func(str string) {
- fmt.Println(str)
- }("i love peixuan right now") //()里面的就是传入的参数
- //函数闭包
- out := 100
- afunc := func() func() {
- in := 10
- return func() {
- fmt.Println("out is ",out,"in is ",in)
- }
- }()
- //panic("nothing")
- rec := recover()
- fmt.Println(rec)
- afunc()
- //fmt.Println(a.(type)) //use of .(type) outside type switch
- //cap 的增长模式 1 2 4 8 16 32 64 128 ……
- testarr := make([]int,1)
- for i := 0; i < 1000; i++ {
- fmt.Println(cap(testarr),len(testarr))
- testarr = append(testarr,i)
- }
- }
- /*
- 小写字母开头的函数只能在本包可见,大写字母开头的函数才能被其他包使用。
- */
- //如果该函数抛出异常,defer后的语句仍然会被执行。
- func CopyFile(dst,src string) (w int64,err error) {
- srcFile,err := os.Open(src)
- if err != nil {
- return
- }
- defer srcFile.Close()
- return w,nil
- }
- func Add(a,b int) (ret int,err error) {
- if a+b > 100 {
- //如果加起来大于100的话就抛出异常
- err = errors.New("sun must under 100")
- return
- }
- return a + b,nil
- }
- //不定参数的函数
- func myfunc(args ...int) {
- for _,arg := range args {
- fmt.Println(arg)
- }
- }
- //任何类型不定参数
- func anyfunc(args ...interface{}) {
- for _,arg := range args {
- switch arg.(type) {
- case int:
- fmt.Println("this int is ",arg)
- case string:
- fmt.Println("this string is ",arg)
- default:
- fmt.Println("not found type ")
- }
- }
- }
- func GetName() (fistName,lastName,nickName string) {
- return "Zhou","Yunxuan","Moss"
- }
- //浮点数比较
- func IsEqual(f1,f2,p float64) bool {
- return math.Abs(f1-f2) < p
- }