go语言入门 (上)| 青训营

176 阅读6分钟

go语言入门(上) | 青训营

这是我在字节跳动青训营学习的第3天,也是我参加《第六届青训营笔记伴读》的第一篇笔记

1.什么是go语言

  • 高性能,高并发:“兼具Python等动态语言的开发速度和 C/C++ 等编译型语言的性能安全性”,基于标准库即可开发高并发程序
  • 语法简单,学习曲线平缓: 简化了c的语法,去掉了不必要的表达式括号,Java、C、JavaScript程序员能很快的上手
  • 丰富的标准库:和python一样,有功能完善的标准库,一般不需要借助第三方库就可以完成基础功能的开发,且标准库有很高的稳定性和兼容性
  • 完善的工具链: go语言在诞生之初就具有丰富的工具链,包括但不限于:包管理,代码格式化,错误检查,性能检测,单元测试,
  • 静态链接
  • 快速编译: 编译速度极快
  • 跨平台: 编译即可执行无需安装依赖环境
  • 垃圾回收: 和java类似,无需考虑内存释放,可帮助程序员专注于业务逻辑

2.开发环境搭建

第一步:可以访问golang.google.cn/dl/ 下载安装Golang

第二步:选择编辑器 VSCode | GoLand

  • VSCode是微软公司开发的,能运行在MacOS X, Windows和Linux上的跨平台开源代码编辑器,若选用该编辑器,还需要下载对应插件
  • GoLand是JetBrains公司开发的商业IDE,是一个收费软件

3.基础语法

Hello World

package main ​
import ( "fmt" ) ​
func main(){
    fmt.Println("hello world") 
}

package main表示这个文件属于main包的一部分,main包也就是程序的入口包,main程序的package必须为main,与文件夹名称无关

第二行导入了标准库里的fmt包,用来往屏幕输入输出字符串,格式化字符串

fmt.Println类似于java中的System.out.println,不过这个Println的P是大写的(别扭),go语言中,首字母大写的方法名,可以被其他包调用,类似于java中的public(奇怪)

变量

go是一门强类型语言,每个变量都有自己的变量类型,变量类型与大多编程语言相似(整数,浮点数,布尔型,字符串,字符)

var a = "hello world"
var b,c int = 1,2 // 定义多个
var d = true  // 类型推断
e := 64 //常用
const pi = 3.141 //定义常量

if-else

if 后建议不加圆括号,但花括号必须加

if 3+3==6 {
    fmt.Println("正确")
}else {
    fmt.Println("数学不存在了")
}

num :=5

if num>0 {
    fmt.Println(num,"是正数")
}else if num < 0{
    fmt.Println(num,"是负数")
}else{
    fmt.Println(num,"是0")
}

循环

golang里只有for循环,但可以通过for循环实现while

for{
    fmt.Println("我是死循环")
    break //退出循环
}

//while循环
num:=0
for num<10{
    fmt.Println(num)
    num++
}

//一般for循环
for i:=0;i<10;i++{
    fmt.Println(i)
}

switch

与c或c++类似,同样的在switch后面的变量名不需要括号,与c不同的是,在go里面 switch中的case不需要加break,它会自动退出,若想跳到下一个case,可以使用fallthrough关键字,此外,Switch后还可以不跟语句,直接在case进行判断

num := 66
switch  { 
    case num==66: 
        fmt.Println(66) 
        fallthrough 
    case num==0: 
        fmt.Println(0) 
    case num==-66: 
        fmt.Println(66) 
    default: 
        fmt.Println("default") 
}

  

数组

与其他语言类似,数组就是一个具有编号且长度固定的元素序列,可以很方便的取特定索引的值,或往固定索引存值,不过在真实业务里我们很少使用数组,因为其长度固定

var a [5]int //一个长度为5的int数组
b:=[5]int{1,2,3,4,5} //一个长度为5的有初始值的数组
a[4] = 100
 fmt.Println(a[3])  //0
 fmt.Println(a[4]) //100
 
 for i:=0;i<5;i++{
      fmt.Println(b[i]) 
 }

切片

可以理解为一个不定长的数组,类似于java中的ArrayList,底层是一个数组,还有两个属性表示长度和容量,当容量不足时会扩容并返回新的slice,

slice初始化时可以指定长度,具有和python一样的切片操作,比如取出切片中2-5的元素

    s:=make([]string,3)
    s[0] = "a"
    s[1] = "b"
    s[2] = "c"
    fmt.Println("get:" ,s[2])
    fmt.Println("len:",len(s))

map

在其他编程语言里,它可能叫做哈希或者字典,map是实际使用过程中最频繁用到的数据结构

可以用make来创建一个空map,需要两个类型,一个是key的类型,一个是value的类型,

golang的map是完全无序的,遍历的时候不会按照字母顺序,也不会按照插入顺序,而是随机顺序

m: :=make(map[string]int)
m["one"]=1
m["two"]=2
fmt.Println(m) //map[one:1 wor:2]
fmt.println(len(m)) //2
fmt.Println(m["one"]) //1

range

对于slice或者map,我们可以用range来快速遍历,这样代码能更简洁,range遍历时会返回两个值,第一个是索引,第二个是值,若我们不需要索引的话,可以用下划线忽略

m:= map[string]string{"a":"A","b":"B"}
for k,v := range m{
    fmt.Println(k,v) //a A,b B
    }

函数

golang的函数原生支持返回多个值,在实际的业务逻辑代码里面,几乎所有函数都返回两个值,第一个是真正的返回结果,第二个是一个错误信息,下面是一个两个变量相加的函数

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

指针

go里的指针相比于c或c++,支持的操作很有限,主要用途是对于传入参数进行修改,这里涉及到形参和实参,如果学过c或c++应该能很好理解,传入函数的参数是形参,形参实际上是一个实参拷贝,形参的值改变不会影响实参,此时我们需要用到指针,通过指针来实现实参的修改

func add2ptr(n *int) {
    *n+=2
}

func main(){
    n:=5
    add2ptr(&n)
    fmt.Println(n) //7
}

结构体

结构体是带类型的字段的集合,下面的结构体包含两个字段,name和password,我们可以用结构体的名称去初始化一个结构体变量,构造的时候需要传入每个字段的初始值,可以用键值对的方式去指定初始值,结构体也支持指针,从而实现对结构体的修改,也可以避免大结构体的拷贝开销

type user struct{
    name string
    password string
 }
 func main(){
     a:= user{name:"wang",password:"1024"}
     b:=user{"wang","1024"}
     c:=user{name:"wang"}
     c.password = "1024"
     fmt.Println(a,b,c,d)
 }

结构体方法

golang可以为结构体定义一些方法,类似于其他语言中的类成员函数,比如这里我们为user定义个方法 定义结构体方法的时候也有两种方法,一种带指针,一种不带,区别同上

func (u *user) checkPassword(password string) bool{
    return u.password == password
}
func main(){
     a:= user{name:"wang",password:"1024"}
     res:=a.checkPassword(a.password)
     fmt.Println(res)
}

实战

golang的基本语法就这些,学完这些就可以实现简单的实战

  • 猜谜游戏
    • 首先生成随机数作为答案
    • 读取用户输入
    • 若输入值比答案大,输出对应提示,反之也输出对应提示
    • 答对则退出程序

参考