Go基础语法入门 | 青训营笔记

71 阅读2分钟

这是我参与「第五届青训营」笔记创作活动的第1天

第一次参加青训营,希望通过这次的学习能够快速上手一门新的语言,当然之前也有过Java、Python的开发,目前感觉还行

为什么学习go

当然一个最简单的原因就是提高竞争力,然后就是go语言优秀的性能和天生语言层面的高并发

语法简单、跨平台、优秀的垃圾回收机制、高性能高并发、快速编译

image.png

环境准备

image.png

image-2.png

HelloWorld

嘿嘿,学习任何语言都要从HelloWorld开始哦

package main

import "fmt"

func main() {
   fmt.Println("Hello, World!")
}

基础语法

怎么说呢,语法很简单,都是大同小异的,甚至go好像更简单一点

变量

字母或下划线开头,由字母、数字、下划线组成

go语言里面的常量没有确定的类型,会根据上下文自动确定类型

package main

//var a = "Hello"
//var b string = "World"
//var c bool

var (
    name1 type1
    name2 type2
)

func main(){
    //println(a, b, c)
    
   const LENGTH int = 10
   const WIDTH int = 5   
   var area int
   const a, b, c = 1, false, "str" //多重赋值

   area = LENGTH * WIDTH
   fmt.Printf("面积为 : %d", area)
   println()
   println(a, b, c) 
}

if-else

if-else写法上和C、C++类似,使用上有一些不同

比如,左边的括号不能另外占一行,必须紧接在后面,还有就是条件不需要另外加括号和if隔开,编译时也会自动去掉

package main

import (  
    "fmt"
)

func main() {  
    if num := 10; num % 2 == 0 { 
        fmt.Println(num,"is even") 
    }  else {
        fmt.Println(num,"is odd")
    }
}

for

go语言中没有while、do while,只有一个for for后面什么都不写,就是一个死循环,其他和C、C++一样,break和continue控制

package main

import "fmt"

func main() {

   var b int = 15
   var a int

   numbers := [6]int{1, 2, 3, 5} 

   for a := 0; a < 10; a++ {
      fmt.Printf("a 的值为: %d\n", a)
   }

   for a < b {
      a++
      fmt.Printf("a 的值为: %d\n", a)
      }

   for i,x:= range numbers {
      fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
   }   
}

switch

和C、C++最大的不同就是不用在case后面显示的写上break

go执行一次就不会继续往下执行跳出整个Switch,如果要再向下执行需要fallthrough

switch不写任何变量,直接在case中写条件分支,这就是一个更强大的if-else

package main

import (  
    "fmt"
)

func main() {  
    num := 75
    switch {
    case num >= 0 && num <= 50:
        fmt.Println("num is greater than 0 and less than 50")
    case num >= 51 && num <= 100:
        fmt.Println("num is greater than 51 and less than 100")
    case num >= 101:
        fmt.Println("num is greater than 100")
    }

}

数组、切片、Map

数组是一个长度固定的元素序列,因为长度固定,很少直接使用

package main

import "fmt"

func main() {
   var n [10]int /* n 是一个长度为 10 的数组 */
   var i,j int

   /* 为数组 n 初始化元素 */         
   for i = 0; i < 10; i++ {
      n[i] = i
   }

   /* 输出每个数组元素的值 */
   for j = 0; j < 10; j++ {
      fmt.Printf("Element[%d] = %d\n", j, n[j] )
   }
}

切片底层还是数组,但提供更丰富的操作,可以任意更改长度,自动扩容

package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)

   /* 允许追加空切片 */
   numbers = append(numbers, 0)
   printSlice(numbers)

   /* 同时添加多个元素 */
   numbers = append(numbers, 2,3,4)
   printSlice(numbers)

   /* 创建切片 numbers1 是之前切片的两倍容量*/
   numbers1 := make([]int, len(numbers), (cap(numbers))*2)

   /* 拷贝 numbers 的内容到 numbers1 */
   copy(numbers1,numbers)
   printSlice(numbers1)   
}

func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

Map习惯叫做哈希或者字典,Map中是完全无序的,遍历时不会按照插入时的顺序返回

package main

import "fmt"

func main() {   
   /* 创建 map */
   countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"}
   
   fmt.Println("原始 map")   
   
   /* 打印 map */
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }
   
   /* 删除元素 */
   delete(countryCapitalMap,"France");
   fmt.Println("Entry for France is deleted")
   
   fmt.Println("删除元素后 map")   
   
   /* 打印 map */
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }
}

函数

package main

import "fmt"

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

   /* 调用函数并返回最大值 */
   ret = max(a, b)
   fmt.Printf( "最大值是 : %d\n", ret )
}

func max(num1, num2 int) int {
   if (num1 > num2) {
      return num1
   }
   return num2 
}

指针

相较于C、C++,go语言指针支持的操作比较有限,不能直接在指针上运算

package main

import (  
    "fmt"
)

func change(val *int) {  
    *val = 55
}
func main() {  
    a := 58
    fmt.Println("before is",a)
    b := &a
    change(b)
    fmt.Println("after is", a)
}

结构体

也就是带类型的字段集合

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books
   
   /* book1 描述 */
   Book1.title = "Go语言"
   Book1.author = "www.baidu.com"
   Book1.subject = "Go 语言教程"
   Book1.book_id = 12345

   fmt.Printf( "Book 1 title : %s\n", Book1.title)
   fmt.Printf( "Book 1 author : %s\n", Book1.author)
   fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
   fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)
}

错误处理

go语言的错误处理不像Java的异常那样,习惯上函数返回都带上一个error,通过简单的if-else来处理错误

package main

import (  
    "fmt"
    "os"
)

func main() {  
    f, err := os.Open("/test.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    
    fmt.Println(f.Name(), "opened successfully")
}