day01 GO语言基础 | 青训营笔记

76 阅读3分钟

1.1 helloworld

package main

import (
   "fmt"
)

func main() {
   fmt.Println("hello world")
}
  • 这段是最简单的hello world,主要的运行原理是:go语言的代码块通过包(package)组织,一个包由单个或多个目录下的*.go源文件* 组成,这个hello world里的包就是main,同时导入了“fmt”标准库。同时go也提供多种标准库,常见的输入输出,排序都包含。
  • main定义了一个独立可执行程序,它是整个程序的入口。函数所做的就算程序所做的。在package后面必须用import告诉程序需要导入哪个包。
  • go也对格式有着严格的要求。gofmt可以把代码格式化为标准格式。

1.2 go语言的特点

  • 高性能,高并发
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

1.3 变量类型

func main() {

   var a = "initial"

   var b, c int = 1, 2

   var d = true

   var e float64

   f := float32(e)

   g := a + "foo"                //因为字符串是内置类型,所以可以直接通过+拼接
   fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
   fmt.Println(g)                // initialapple

   const s string = "constant"
   const h = 500000000
   const i = 3e20 / h
   fmt.Println(s, h, i, math.Sin(h), math.Sin(i))  //constant 500000000 6e+11 -0.28470407323754404 0.7591864109375384
}

变量的两种声明方式①var 变量名 = xxx,会自动根据上下文识别变量类型。②变量名 := 值。常量的声明只要将var改成const即可。

1.4 if/else

func main() {
   if 7%2 == 0 {
      fmt.Println("7 is even")
   } else {
      fmt.Println("7 is odd")
   }  
}

不用像其它语言一样在if后面给条件加(),即使加上()在保存时编辑器也会自动取消掉。

1.5 切片

func main() {
   s := make([]string, 3)   //使用make创建长度为3的字符串数组
   s[0] = "a"
   s[1] = "b"
   s[2] = "c"
   fmt.Println("get:", s[2])   // c
   fmt.Println("len:", len(s)) // 3

   s = append(s, "d")     //append添加扩容
   s = append(s, "e", "f")
   fmt.Println(s) // [a b c d e f]

   c := make([]string, len(s))
   copy(c, s)
   fmt.Println(c) // [a b c d e f]

   fmt.Println(s[2:5]) // 切片输出第二个到第4个元素,输出[c d e]
   fmt.Println(s[:5])  // 输出5以前元素,[a b c d e]
   fmt.Println(s[2:])  // 输出2以后的元素[c d e f]

   good := []string{"g", "o", "o", "d"}
   fmt.Println(good) // [g o o d]
}

1.6 map

import "fmt"

func add2(n int) {   //一个给n加2的函数,但是是无效的,因为是一个拷贝函数
   n += 2
}

func add2ptr(n *int) { //正确写法,要传入指针类型,且在调用时给里面填入值时候要加一个&符号才可用正确调用
   *n += 2
}

func main() {
   n := 5
   add2(n)
   fmt.Println(n) // 5
   add2ptr(&n)     //调用函数时需要加&才可用正确调用
   fmt.Println(n) // 7
}

1.7 字符串操作

func main() {
   a := "hello"
   fmt.Println(strings.Contains(a, "ll"))                // a中是否包含“ll”,输出true
   fmt.Println(strings.Count(a, "l"))                    // a中的“l”有多少个,输出2
   fmt.Println(strings.HasPrefix(a, "he"))               // a的前置是否是“he”,输出true
   fmt.Println(strings.HasSuffix(a, "llo"))              // a的最后是否是“llo”,输出true
   fmt.Println(strings.Index(a, "ll"))                   // 2
   fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // 在he和llo字符中间加入“-”he-llo
}

2.1 练习1-猜谜游戏

import (
   "bufio"
   "fmt"
   "math/rand"
   "os"
   "strconv"
   "strings"
   "time"                //首先需要导入可能用到的库
)

func main() {
   maxNum := 100           //先将最大的数字定义为100,所猜想的数字不能超过100
   rand.Seed(time.Now().UnixNano())   
   secretNumber := rand.Intn(maxNum)   //利用随机数生成一个在最大数100范围内的随机数
   fmt.Println("Please input your guess")
   reader := bufio.NewReader(os.Stdin)
   for {
      input, err := reader.ReadString('\n')
      if err != nil {
         fmt.Println("An error occured while reading input. Please try again", err)
         continue
      }
      input = strings.Trim(input, "\r\n")

      guess, err := strconv.Atoi(input)
      if err != nil {
         fmt.Println("Invalid input. Please enter an integer value")
         continue
      }
      fmt.Println("You guess is", guess)
      if guess > secretNumber {    //如果猜的数组大于随机数,重新读取新输入的数字
         fmt.Println("Your guess is bigger than the secret number. Please try again")
      } else if guess < secretNumber {   //如果猜的数组小于随机数,重新读取新输入的数字
         fmt.Println("Your guess is smaller than the secret number. Please try again")
      } else {         //如果猜的数字刚刚好,则可以跳出循环
         fmt.Println("Correct, you Legend!")
         break
      }
   }
}