Go语言学习二

126 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

昨天我们初步了解了Go语言的变量、常量和运算符,今天我们继续学习

Go的条件语句

package main

import "fmt"

func main() { //Go没有三目运算符,不支持?:形式的条件判断
   var a int = 10

   // if语句
   if a < 20 {
      fmt.Printf("a 小于 20\n")
   }
   fmt.Printf("a 的值为:%d\n", a)

   // if...else语句
   a = 30

   if a < 20 {
      fmt.Printf("a 小于 20\n")
   } else {
      fmt.Printf("a 不小于 20\n")
   }
   fmt.Printf("a 的值为:%d\n", a)

   // if嵌套语句
   var b int = 10
   var c int = 20

   if b == 10 {
      if c == 20 {
         fmt.Printf("a的值为10, b的值为20\n")
      }
   }
   fmt.Printf("b 的值为:%d\n", b)
   fmt.Printf("c 的值为:%d\n", c)

   // switch语句
   var grade string = "B"
   var marks int = 90

   switch marks {
   case 100:
      grade = "A"
   case 90:
      grade = "B"
   case 70, 80:
      grade = "C"
   case 60:
      grade = "D"
   default:
      grade = "E"
   }

   switch {
   case grade == "A":
      fmt.Printf("优秀!\n")
   case grade == "B", grade == "C":
      fmt.Printf("良好\n")
   case grade == "D":
      fmt.Printf("及格!\n")
   case grade == "E":
      fmt.Printf("不及格!\n")
   default:
      fmt.Printf("叉出去!\n")
   }

   /*
      如果有多个case可以运行,select会随即公平地选出一个执行。其他不会执行
      否则,如果有default子句,则执行该子句
      若没有default子句,select将阻塞,知道某个通信可以运行;
      Go不会重新对channel或值进行求值
   */
   var c1, c2, c3 chan int
   var i1, i2 int

   select {
   case i1 = <-c1:
      fmt.Printf("received ", i1, "from c1\n")
   case c2 <- i2:
      fmt.Printf("sent ", i2, "to c2\n")

   case i3, ok := (<-c3):
      if ok {
         fmt.Printf("received ", i3, "from c3\n")
      } else {
         fmt.Printf("c3 is closed\n")
      }
   default:
      fmt.Printf("no communication\n")

   }
   //select 会循环检测条件,如果有满足则执行并退出,否则一直循环检测。
}

Go的循环语句

package main

import (
   "fmt"
)

func main() {
   //for循环
   sum := 0
   // for init; condition; post { }
   /*
      init:一般为赋值表达式,给控制变量赋初值
      condition:关系表达式或逻辑表达式,循环控制条件
      post:一般为赋值表达式,给控制变量增量或减量
   */
   for i := 0; i <= 10; i++ {
      sum += i
   }
   fmt.Println(sum)

   //init和post参数是可选的,我们直接省略,类似while语句
   sum = 1
   for sum <= 10 {
      sum += sum
   }
   fmt.Println(sum)

   //和上面一样,只是更简洁,也更像while语句
   for sum <= 10 {
      sum += sum
   }
   fmt.Println(sum)

   // For-each range 循环
   //对字符串、数组、切片等进行迭代输出元素

   string := []string{"Tom", "Jerry"}
   for i, s := range string {
      fmt.Println(i, s)
   }

   numbers := [6]int{1, 2, 3, 5, 8}
   for i, x := range numbers {
      fmt.Printf("第 %d 位 x 的值为 %d\n", i, x)
   }

   //循环嵌套
   //判断100以内的素数
   var i, j int
   for i = 2; i < 100; i++ {
      for j = 2; j <= (i / j); j++ {
         if i%j == 0 {
            break
         }
      }
      if j > (i / j) {
         fmt.Printf("%d 是素数\n", i)
      }
   }

   //九九乘法表
   for m := 1; m < 10; m++ {
      for n := 1; n <= m; n++ {
         fmt.Printf("%d x %d = %d\t", n, m, n*m)
      }
      fmt.Println("")
   }

   //循环控制语句

   //break语句:用于中断当前for循环或跳出switch语句
   var x int = 10
   for x < 20 {
      fmt.Printf("x 的值为:%d\n", x)
      x++
      if x > 15 {
         break
      }
   }

   //continue语句:跳过当前循环的剩余语句,继续下一轮循环
   var y int = 10

   for y < 20 {
      if y == 15 {
         // 跳过此次循环
         y = y + 1
         continue
      }
      fmt.Printf("y 的值为 : %d\n", y)
      y++
   }

   //goto语句:将控制转移到被标记的语句
   var z int = 10
   //在变量 a 等于 15 的时候跳过本次循环并回到循环的开始语句 LOOP 处
LOOP:
   for z < 20 {
      if z == 15 {
         z = z + 1
         goto LOOP
      }
      fmt.Printf("z的值为:%d\n", z)
      z++
   }
}

Go语言函数

/*
package main

import "fmt"

func main() {
   var a int = 100
   var b int = 200
   var res int

   res = max(a, b)
   fmt.Printf("最大值是:%d\n", res)

   x, y := swap("Tom", "Jerry")
   fmt.Println(x, y)
}

func max(num1, num2 int) int {
   var result int
   if num1 > num2 {
      result = num1
   } else {
      result = num2
   }
   return result
}

func swap(x, y string) (string, string) {
   return y, x
}
*/

//函数参数:值传递和引用传递
//package main
//
//import "fmt"
//
////值传递
///*
//func swap(x, y int) int {
// var temp int
// temp = x
// x = y
// y = temp
//
// return temp
//}
//*/
//
////引用传递
//func swap(x *int, y *int) {
// var temp int
// temp = *x
// *x = *y
// *y = temp
//}
//
//func main() {
// var a int = 100
// var b int = 200
//
// //值传递
// /*
//    fmt.Printf("交换前a = %d, b = %d\n", a, b)
//    swap(a, b)
//    fmt.Printf("交换后a = %d, b = %d\n", a, b)
// */
//
// fmt.Printf("交换前a = %d, b = %d\n", a, b)
// swap(&a, &b)
// fmt.Printf("交换后a = %d, b = %d\n", a, b)
//}

//Go语言函数作为实参
//package main
//
//import (
// "fmt"
// "math"
//)
//
//func main() {
// getSqrtNum := func(x float64) float64 {
//    return math.Sqrt(x)
// }
//
// fmt.Println(getSqrtNum(9))
//}

/*
Go语言支持匿名函数,可作为闭包
匿名函数是一个内联语句或表达式
匿名函数的优越性在于可以直接使用函数中的变量
我们创建了getSequnce(),返回另一个函数
目的:在闭包中递增i变量
*/
//package main
//
//import "fmt"
//
//func getSequnce() func() int {
// i := 0
// return func() int {
//    i += 1
//    return i
// }
//}
//
//func main() {
// nextNum := getSequnce()
//
// //调用nextNum函数
// fmt.Println(nextNum())
// fmt.Println(nextNum())
// fmt.Println(nextNum())
//
// //创建新的函数
// nextNum1 := getSequnce()
// fmt.Println(nextNum1())
// fmt.Println(nextNum1())
// fmt.Println(nextNum1())
//
//}

/*
Go语言中同时有函数和方法
一个方法就是一个包含了接收者的函数
接收者可以是命名类型或结构体类型的一个值或指针
所有给定类型的方法属于该类型的方法集
Go没有面向对象这一特性
在Go里面,这个this指针需要明确申明出来
*/
package main

import "fmt"

//定义一个结构体
type Circle struct {
   radius float64
}

func (c Circle) getArea() float64 {
   //属性:c.radius
   return 3.14 * c.radius * c.radius
}

func main() {
   var c1 Circle
   c1.radius = 10.0
   fmt.Println("圆的面积 = ", c1.getArea())
}