Go语言入门(二)-流程控制

时间:2022-07-25
本文章向大家介绍Go语言入门(二)-流程控制,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

go流程控制

字符串详解

字符串原理

  • 字符串底层就是一个byte数组,所以可以和[]byte类型互相转换
  • 字符串中的字符是不能修改的
  • 字符串是有byte字节组成,所以字符串的长度是byte字节的长度
  • rune类型(int32占四个字节)用来表示utf8字符,一个rune由一个或者多个byte组成
func stringByte() {
   var str string
   str = "abc你好"
   var b []byte = []byte(str)
   var c[]rune = []rune(str)
   fmt.Printf("%cn",97)
   fmt.Printf("b=%v,tlen(str)=%dn",b,len(str))
   fmt.Printf("%dn",len(c))
}

练习

写一个程序,对英文字符串进行逆序

func reverseStr(s string) string {
   bytes := []byte(s)
   for i:=0;i<len(s)/2;i++{
      //fmt.Printf("%c",i)   输出字符串
      var tmp = bytes[i]
      bytes[i] = bytes[len(s)-i-1]
      bytes[len(s)-i-1] = tmp
   }
   s = string(bytes)
   return s
}

func main() {
   //stringByte()
   s:= "abcdefg"
   fmt.Println(reverseStr(s))
}

写一个程序,实现对包含中文的字符串进行逆序

func reverseChinese(s string)  {
   bytes := []rune(s)
   for i:=0;i< len(bytes)/2;i++ {
      bytes[i],bytes[len(bytes)-i-1] = bytes[len(bytes)-i-1],bytes[i]
   }
   s = string(bytes)
   fmt.Println(s)
}

func main() {
   s:= "abcdefg中国"
   fmt.Println(reverseChinese(s))
}

写一个程序,判断一个字符串是否是回文

func isReversed(s string) string {
   r := []rune(s)
   for i:=0;i <len(r)/2;i++ {
      r[i],r[len(r)-i-1] = r[len(r)-i-1],r[i]
   }
   s1 := string(r)
   if s1 == s{
      return "is huiwen"
   }else {
      return "not huiwen"
   }
}

日期和时间类型

  • time包
  • 获取当前时间
  • 时间格式化
  • 时间戳和时间之间的转换
  • 定时器的简单使用
  • time.Duration()表示纳秒
package main

import (
   "fmt"
   "time"
)

func getTime() {
   now:=time.Now()
   year := now.Year()
   month := now.Month()
   day := now.Day()
   hour := now.Hour()
   minute := now.Minute()
   second := now.Second()
   fmt.Printf("%vn",now)
   fmt.Printf("year=%d,month=%d,day=%d,hour=%d,minute=%d,second=%dn",
      year,month,day,hour,minute,second)
}

func getTimeStamp() {
   now := time.Now()
   timestamp := now.UnixNano()
   fmt.Printf("%dn",timestamp)
}

func Dingshiqi() {
   timer :=time.NewTimer(time.Second)
   for v := range timer.C {
      fmt.Printf("time:%vn",v)
      //定时一秒刷新
      timer.Reset(time.Second)
   }
}

func TimeTicker() {
   timer := time.NewTicker(time.Second)
   for v := range timer.C {
      fmt.Printf("time: %vn",v)
   }
}

func TimeStampToTime(timestamp int64) {
   time_t := time.Unix(timestamp,0)
   fmt.Printf("time %vn",time_t)
}

func FormatTime() {
   now := time.Now()
   //Go 诞生时间
   str := now.Format("2006/01/02 15:04:05")
   fmt.Printf("str: %sn",str)
}

func main() {
   //getTime()
   //getTimeStamp()
   /*
   //go Dingshiqi()
   go TimeTicker()
   time.Sleep(time.Minute)
    */
   //TimeStampToTime(time.Now().Unix())

}

小练习

写一个程序,统计一段代码的执行耗时,单位精确到微秒

func testCase() {
   for i:=0;i<10000000000;i++{
      _=i
   }
}

func main() {
   //获取纳秒数
   start_time := time.Now().UnixNano()
   testCase()
   end_time := time.Now().UnixNano()
   fmt.Printf("cost time is %d us,also %d msn",(end_time-start_time)/1000,(end_time-start_time)/1000000)

}

流程控制

if条件语句

func judgeNum() {
   num := 10
   if num % 2 ==0 {
      fmt.Printf("%d是偶数n",num)
   }else {
      fmt.Printf("%d是奇数n",num)
   }
}
func guessNum() {
   num := 99
   if num <=50 {
      fmt.Printf("%d小于等于50n",num)
   } else if num >= 51 && num <= 100 {
      fmt.Printf("%d大于等于51,小于等于100n",num)
   } else {
      fmt.Printf("%d大于100n",num)
   }
}

for循环

func simpleFor() {
   for i:=1;i<=10;i++ {
      fmt.Printf("%dn",i)
   }
}

func forcase() {
   i := 0
   for ;i<=10; {
      fmt.Printf("%dn",i)
      i+=2
   }
}

func breakFor() {
   for i:=0;i<=10;i++ {
      if i > 5 {
         break
      }
      fmt.Printf("%dn",i)
   }
}

func continueFor() {
   for i:=0;i<=10;i++ {
      if i == 5 {
         continue
      }
      fmt.Printf("%dn",i)
   }
}

func forCase() {
   for no,i := 10,1;i<=10&&no<=19;i,no=i+1,no+1 {
      fmt.Printf("%d * %d = %dn",no,i,no*i)
   }
}

// 无限循环
func deadLoop() {
   for {
      fmt.Printf("hello")
   }
}

switch语句

func switchCase() {
   f:=9
   switch f {
   case 1:
      fmt.Printf("enter case 1n")
      fmt.Printf("f=1n")
      //fallthrough
   case 2:
      fmt.Printf("enter case 2n")
      fmt.Printf("f=2n")
   case 3:
      fmt.Printf("enter case 3n")
      fmt.Printf("f=3n")
   default:
      fmt.Printf("enter default casen")
   }
}

func switchCase2 () {
   letter := "i"
   switch letter {
   case "a","e","i","o","u":
      fmt.Printf("元音字母%sn",letter)
   default:
      fmt.Printf("辅音字母%sn",letter)
   }
}

//条件判断格式
func switchCase3() {
   num := 75
   switch  {
   case num<75:
      fmt.Printf("数字 %d 小于75n",num)
   case num>=75 && num <=85:
      fmt.Printf("数字%d大于75,小于85n",num)
   default:
      fmt.Printf("数字%d大于85n",num)
   }
}

小练习

猜数字练习

func randCase() {
   var number int
   /*
   伪随机数
   for i:=0;i<10;i++{
      number = rand.Intn(100)
      fmt.Printf("number:%dn",number)
   }
   return
    */
   //生成随机数种子
   rand.Seed(time.Now().UnixNano())
   number = rand.Intn(100)
   fmt.Println(number)

   fmt.Printf("猜一个数字,数字的范围是0到100n")
   for {
      var input int
      fmt.Scanf("%dn",&input)
      var flag bool = false
      switch  {
      case number > input:
         fmt.Printf("输入的比较小%dn",input)
      case number == input:
         fmt.Printf("猜对了%d,正确值是%dn",input,number)
         flag = true
      case number<input:
         fmt.Printf("输入的比较大%dn",input)
      }
      if flag {
         break
      }
   }
}