青训营后端豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

180 阅读4分钟

Go 语言入门

1. go语言介绍

Go语言(又称Golang)是一种由Google开发的开源编程语言,设计初衷是为了提高软件开发的效率和简化程序的构建。以下是Go语言的一些主要特点:

  1. 简洁性:Go语言的语法简洁明了,易于学习和使用,降低了开发者的学习曲线。
  2. 高性能:Go是编译型语言,生成的二进制文件运行速度快,适合高性能的系统开发。
  3. 并发支持:Go语言内置了强大的并发编程模型,通过Goroutine和Channel,使得处理并发任务变得简单高效。
  4. 垃圾回收:Go拥有自动垃圾回收机制,简化了内存管理,减少了内存泄露的风险。
  5. 强类型和静态类型:Go是强类型和静态类型的语言,能够在编译时发现类型错误,增强了代码的安全性。
  6. 跨平台:Go语言支持多种操作系统,可以在不同平台上编译和运行相同的代码。
  7. 丰富的标准库:Go的标准库提供了丰富的功能,支持网络编程、文件操作、数据处理等多种常见任务。

Go语言在云计算、微服务、网络编程等领域得到了广泛应用,尤其适合构建高效、可扩展的系统。

2. go语言环境

建议开发环境-集成豆包或goland,简单易上手

3. go基础语法

3-1. 基础模板

打印helloworld

package main

import (
    "fmt"
)

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

3-2 其中 import 为导入库 ,func main()为主函数

3-2. 变量 package main

import (
        "fmt"
        "math"
)

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))
}

*变量申明 *

go可以自动确定类型,所以不需要申明变量类型

(1)  var + 变量名 = 值

(2)  变量名 := 值

   注意:关键字为  const + 变量名 = 值

3-3 if-else

package main

import "fmt"

func main() {

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

        if 8%4 == 0 {
                fmt.Println("8 is divisible by 4")
        }

        if num := 9; num < 0 {
                fmt.Println(num, "is negative")
        } else if num < 10 {
                fmt.Println(num, "has 1 digit")
        } else {
                fmt.Println(num, "has multiple digits")
        }
}

与c语言类似,但是if后面没有括号

3-4 for循环

package main

import "fmt"

func main() {

        i := 1
        for {
                fmt.Println("loop")
                break
        }
        for j := 7; j < 9; j++ {
                fmt.Println(j)
        }

        for n := 0; n < 5; n++ {
                if n%2 == 0 {
                        continue
                }
                fmt.Println(n)
        }
        for i <= 3 {
                fmt.Println(i)
                i = i + 1
        }
}

与C语言大致一样, 但是也没括号 没有while循环和do while

** 3-4 switch语句**

package main

import (
        "fmt"
        "time"
)

func main() {

        a := 2
        switch a {
        case 1:
                fmt.Println("one")
        case 2:
                fmt.Println("two")
        case 3:
                fmt.Println("three")
        case 4, 5:
                fmt.Println("four or five")
        default:
                fmt.Println("other")
        }

        t := time.Now()
        switch {
        case t.Hour() < 12:
                fmt.Println("It's before noon")
        default:
                fmt.Println("It's after noon")
        }
}

与C语言大致一样,但是也没有括号

特殊一点

switch里上述a变量类型可以是字符串,并且不需要break运行完case后面的会直接跳出 不会运行剩下的case。

3-5数组

package main

import "fmt"

func main() {

        var a [5]int
        a[4] = 100
        fmt.Println("get:", a[2])
        fmt.Println("len:", len(a))

        b := [5]int{1, 2, 3, 4, 5}
        fmt.Println(b)

        var twoD [2][3]int
        for i := 0; i < 2; i++ {
                for j := 0; j < 3; j++ {
                        twoD[i][j] = i + j
                }
        }
        fmt.Println("2d: ", twoD)
}

数组用 var a[5]+数组里面数据类型 可以不用初始化 int 默认为0,string默认为[ ]里面space数为数组里元素个数

或者用 b := [5]int{1,2,3} ---{}里面可以什么都不写但是要加上{},也不可以越界

特殊之处--切片

实质是数组+指针

package main

import "fmt"

func main() {

        s := make([]string, 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")
        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]) // [c d e]
        fmt.Println(s[:5])  // [a b c d e]
        fmt.Println(s[2:])  // [c d e f]

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

由于数组中元素个数为定值,所以很少用,大多数用切片

切片与数组类似但是元素个数是可变化的

切片创建

eg:

s := make([]string,3)

与数组的操作相似,但是多了几点

追加元素s = append(s, "a")

** 删除无内置函数所以需要自己写**

   eg:  a = append(a[:2], a[3:]...) // 先取索引为2之前的元素不包括二,再取索引为3及之后的元素
   其中a = append(...)为更新切片不是重新定义
   即删掉了索引为2的元素
   

3-7 map

类似于python中的字典

 m := make(map[string]int)
 m["first"] = 1                   //添加元素
 
 delete(m , "first")              //删除元素

元素里面是无序的。

3-8range

num := []int{1,2,3,4}

for i , s := range num{
    fmt.Println(i, s)       //i为索引,s为元素从头开始遍历
}

3-9函数

func add(a int ,b int) int {
    return a + b
    }

函数值里面必须申明变量类型,并且是后置的

3-10指针

指针使用有限制一般只用于函数里改变变量的值

3-11结构体

与c语言类似