go_2

1. 流程控制

if j:=12;j < 12 {
        println("sssss")
    }
switch key {
    case 'a','b':
          print()
      fallthrough // 默认只穿透一层
case 'b': print() default: print() }
switch 后面可以不带表达式
可以在表达式那定义变量
for i := 1; i < 10; i++ {
        
    }
------
j := 1
for j < 10 {
   println(1)
   j++
}
----------
for  {
   println(1)
}
------
for ; ; {
   print()
}

------
var str = "hello"
    for i, i2 := range str {
        println(i2)
    }
i 代表字节位置

break

label: {
    label2: {
         break label
    }  
}



lable2:
    for i := 0; i < 4; i++ {
        for j := 0; j < 8; j++ {
            break lable2
        }
    }

2. 函数

func  函数名(参数列表) (返回值列表){

    return
}

  函数也是一种数据类型 可以赋值给变量,可以当型参传递

func main() {
    //fmt.Printf("addNumber的类型是%T:",addNumber)
    fmt.Printf("addNumber2的类型是:%T\n",addNumber2)
    fmt.Printf("addNumber2的执行结果是:%v\n",addNumber2(addNumber,34))
}

func addNumber(a1 int,a2 int) int {
    return a1+a2
}
// 自定义类型
type myFunc func(int,int) int
type myint int
func addNumber2(a3 func(int,int) int,a4 int) int { return a3(a4,a4)+a4 }

// 定义返回值名
func addNumber(a1 int,a2 int) (sum int) {
return a1+a2
}
 

 

3. 编译

go build -o bin/my.exe mainpath // 指定别名编译

 

4. 闭包

 函数与外部引用的类型构成一个整体,多次调用外部引用的变量不重新初始化

func AddUpper() func(int) int {
    n := 10
    str := "hello"
    return func(x int) int {
        n += x
        str += string(x)
        println("str=",str)
        return n
    }
}

如果用传统的方法需要重复传入参数

 

5. defer

等函数执行完之后执行等语句 按代码顺序压入栈中,filo 压入栈中的时候值会随着压入

6. 内置函数

字符函数
1
. len() 返回utf8的字符数 2. []rune() 适合处理中文遍历 runes := []rune("123尘封") for i2 := range runes { fmt.Printf("%c\n",runes[i2]) } 3. n,err := strconv.Atoi("123g") 字符串转整数 4. s := strconv.Itoa(123) 整数转字符串 5. bytes := []byte("123") 字符串转字节数组 6. s2 := string([]byte{49, 50, 51}) 字节数组转字符串 7. n := strconv.FormatInt(2,2) 返回十进制到其他进制到转换 的字符串形式 8. strings.ContainsAny("hello","l1o") 字符串包含 9. strings.Count("hello","l") 子串个数 10. strings.EqualFold("","") 不区分大小写比较 == 区分大小写 11. strings.Index("avc","a") 第一次出现的位置 -1 不存在 12. ns := strings.Replace("go go hello","go","java",-1) 替换n个字符 -1 代表全部替换 13. strings.TrimSpace(" tb asdf dd") 去除两端的空格 14. strings.Trim(" hello "," o") 去除左右两边的字符 15. strings.TrimLeft(" hello "," o") 去掉左边的字符 16. strings.HasPrefix("","") 以某字符开头
日期函数
1. time.Now() 获取当前时间
2. now.Format("2006-01-02 15:04:05") 日期格式化
3. now.Unix() unix 时间戳
4. new 分配基本类型内存
    i := new(int)
    *i = 100

7. 错误处理

func testError() {
    defer func() {
        err := recover()
        if err != nil {
             println("error le ", err)
        }
    }()
    n1 := 10
    n2 := 0
    res := n1 / n2
    println("res wa",res)
}

8. 自定义错误

func main() {
    err := throwError("jjj")
    if err != nil {
         panic(err)
    }
}
func throwError(filename string) (err error) {
    if filename != "jpg" {
        return errors.New("读取文件错误。。。")
    }
    return nil
}

9. 数组

var arr = [3]int{1, 2, 3}
var arr1 = [...]int{1,2,2,3}
func changeArrValue(arr *[3]int) {
    (*arr)[0] = 1
}

数组引用传递可在函数内修改

 

10. 切片

数据个数不确定的时候可以使用切片

引用数据类型 相当于一个struct ptr引用 len cap三个属性

创建切片的三种方式
1. var arr1 = [3]int{2,2,3}
    slice := arr1[0:2]
arr1[start:] start-len
        arr1[:end] 0-end
        arr1[:] = 0-len()
2. var sl = make([]int,4,10) type len cap 3.var s2 = []int{1,2,3}
4. append(切片,切片...) 把切片全部添加到目标切片中
5. copy(切片,切片)

切片可以重复切片 指向同一个数组空间

数组是byte数组,可以进行切片处理str[4:5]

要修改字符串中的某个字符需要将字符串转化成切片修改完在转为字符串

str := "hello@zzz"
    slice := []rune(str) 按字符
    //slice := []byte(str) 按字节
    slice[0] = ''
    fmt.Println(string(slice))

11, 二维数组

var matrix [4][5]int
    matrix[0][0] = 1

var matrix  = [4][5]int{{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}}
 
遍历二维数组
var matrix  = [4][5]int{{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}}
    for _, v := range matrix {
        for _, v2 := range v {
            fmt.Println(v2)
        }
    }

 

posted @ 2022-02-07 22:28  rudynan  阅读(30)  评论(0编辑  收藏  举报