Go语言入门第一课 | 青训营

77 阅读1分钟

字节跳动青训营笔记1

这是我参加青训营的第一篇笔记,主要记录一下Go语言的概述,基本语法和应用。
  1. Go语言概述

    Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。Go语言能让我们访问底层操作系统,还提供了强大的网络编程和并发编程支持。

    Go语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。Go语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势,目前国内诸多 IT 公司均已采用Go语言开发项目。

    Go语言有时候被描述为“C 类似语言”,或者是“21 世纪的C语言”。Go 从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。

二、Go语言基本语法

1、变量声明:

    var a = "initial"
    var b,c int =1,2
    var d = true 
    var e float64 
    f := float32(e) 
    g := a + "foo" 
    fmt.Println(g)//initialfoo

2、流程控制:

//for、if语句
   for n:=0;n<5;n++ {
       if n%2 == 0 {
          continue
        }
       fmt.Println(n)
    }
//switch语句
    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")
    }

3、数组及切片

  //数组
	var a [5]int
	a[4] = 100
	fmt.Println(a[4],len(a))//100 5
	b:=[5]int{1,2,3,4,5}
	fmt.Println(b)//[1 2 3 4 5]
	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)//2d:  [[0 1 2] [1 2 3]]

4、map、slice和切片

  //切片
	s:= make([]string,3)
	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
        fmt.Println("get:",s[2])//get: c
	fmt.Println("len:",len(s))//len: 3
	
	s = append(s,"d")
	fmt.Println(s)//[a b c d]
	c:=make([]string,len(s))
	copy(c,s)
	fmt.Println(c)//a b c d]
	fmt.Println(s[2:4])//[c d]
	fmt.Println(s[:4])//[a b c d]
	fmt.Println(s[2:])//[c d],从2开始
	 
	good := []string{"g","o","o","d"}
	fmt.Println(good)//[g o o d]

5、指针

package main
import "fmt"

func add(n int){ 
	n+=2 
}
func addptr(n *int){
	*n+=2
}
func main(){
	n := 5
	add(n)
	fmt.Println(n)//5
	//go指针对传入参数进行修改
	addptr(&n)
	fmt.Println(n)//7
}

6、错误处理

package main
import (
	"errors"
	"fmt" 
)
type user struct {
	name string
	password string
}
func findUser(users []user,name string) (v *user, err error) {
	for _,u:=range users {
	    if u.name == name {
	        return &u,nil
	    }
	}
	return nil,errors.New("not found") 
}
func main() {
	//错误处理两种写法
	u, err := findUser([]user{{"wang","1024"}},"wang")
	if err != nil {
	    fmt.Println(err)
	    return
	}
	fmt.Println(u.name)//wang

	// if u,err :=findUser([]user{{"wang","1024"}},"li");err!=nil{
	// 	fmt.Println(err)
	//     return
	// }else {
	// 	fmt.Println(u.name)//not found
	// }
}

7、JSON处理

package main
import (
	"encoding/json"
	"fmt" 
)
type userInfo struct {
	Name string
	Age int `josn:"age"`
	Hobby []string
}
func main(){
	a := userInfo{Name:"wang",Age:18,Hobby:[]string{"Golang","TypeScript"}}
	buf,err := json.Marshal(a)
	// json.Marshal序列化:具有一定结构的对象转换为可以存储或传输的形式
	if err != nil {
		panic(err)
	}
	fmt.Println(buf)//[123 34 78 97...]
	fmt.Println(string(buf))//{"Name":"wang","Age":18,"Hobby":["Golang","TypeScript"]}

	buf,err = json.MarshalIndent(a,"","\t")
	if err != nil{
		panic(err)
	}
	fmt.Println(string(buf))//{"Name": "wang","Age": 18,"Hobby": ["Golang","TypeScript"]}
	var b userInfo
	err = json.Unmarshal(buf,&b)
	//json.Unmarshal反序列化:序列化的逆过程
	if err != nil{
		panic(err)
	}
	fmt.Printf("%#v\n",b)//{wang 18 [Golang TypeScript]}
}

三、Go语言项目实战

1、猜谜游戏(循环输入数字,直至猜中随机生成的那一个)

package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	maxNum := 100
	rand.Seed(time.Now().UnixNano())//UnixNano()是当前纳秒
	secretNumber := rand.Intn(maxNum)
        //rand.Intn(n int64)获取小于n的随机数
	// fmt.Println("The secret number is ", secretNumber)
        
	fmt.Println("Please input your guess")
	reader := bufio.NewReader(os.Stdin)
        //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
            }
	}
}