Go---基础语法

51 阅读4分钟

什么是Go语言

* 高性能、高并发;语法简单、学习曲线平缓;丰富的标准库;完善的工具链;静态链接;快速编译;跨平台;垃圾回收

字节为什么全面拥抱Go语言

* 性能比较好;部署简单、学习成本低;内部RPC和HTTP框架的推广

Go入门

基础语法-helloworld

package main

import  "fmt"

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

发现一个大大的问题Go中没有“;

基础语法

变量

变量的定义初始化只是格式的不同,而且不需要指明类型,会直接自动识别

var a="inital"    //字符串初始化
var b,c int =1,2  //多个整型初始化
var d=true        //bool值初始化
var e float64     //浮点类型初始化
package main

import(
    "fmt"
    "math"
)

func main(){
    var a="inital"    //字符串初始化
    var b,c int =1,2  //多个整型初始化
    var d=true        //bool值初始化
    var e float64     //浮点类型初始化
    f :=float32(e)    //赋值
    g :=a + "foo"     //赋值
    fmt.Println(a,b,c,d,e,f) //inital 1 2 true 0 0
    fmt.Println(g)           //initialapple
    
    const s string="constant" 
    const h=50000000
    const i=3e20 /h
    fmt.Println(s,h,l,math.Sin(h),math.Sin(i))
    }

if else

package main
import "fmt"
func main()
{

    if 7%2 {
        fmt.Println("7 is even")
    } else {
        fmt.Println("7 is odd")
    }
    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和c++的,if,if else,还有if中的嵌套 和c/c++的区别是:if语句后面不用带括号,而且可以初始化新的变量if num :=9;num<0

循环

package main
import "fmt"
func main()
{
    i :=1
    for{
        fmt.Println("loop")
        break
    }
    for j :=7;j<9;j++{
        if n :=0;n<5;n++{
            continue
        }   
        fmt.Println(i)
    }
    for i<=3{
        fmt.Println(i)
        i=i+1
    }
}

switch

基本格式和C语言一致,就是少去了括号还有break,在switch分支后面还可以不加条件,直接加在case的后面,变成更加高阶的if else语句

package main
import "fmt"
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 is before noon")
    default:
        fmt.Println("It is after noon")
    }
}

数组

主要区别还是在于格式的不同,写起来不是很顺畅

    package main
    import "fmt"
    func main()
    {
        var a [5]int
        a[4] = 100
        fmt.Println(a[4], 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("sd: ",twoD)
    }

切片

切片语法感觉很类似之前所学过的python,给定一个范围,取该范围内的值

    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")          //添加d元素
        s = append(a,"e","f")      //添加e,f元素
        fmt.Println(s)             //[a b c d e f]
        c :=make([]string,len(s))
        copy(c,s)
        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]
    }

map

map里面有一个键值对,第一个值是标识的关键码,第二个值是所存储的值

package main
import "fmt"
func main()
{
    m :=make(map[string]int)
    m["one"]=1
    m["two"]=2
    fmt.Println(m)           //map[one:1 two:2]
    fmt.Println(len(m))      //2
    fmt.Println(m["one"])    //1
    fmt.Println(m["unknow"]) //0
    
    r,ok :=["unknow"]
    fmt.Println(r,ok)       //0 false
    
    delete(m,"one")
    
    m2 :=map[string]int{"one":1,"two":2}
    var m3=map[string]int{"one "}
}

range

用来快速遍历,使代码更加简洁,range遍历的时候,对于数组会返回两个值,一个是索引,一个是值,也就是一个键值对。

for k,v :=range m{
    fmt.Println(k,v)
}

函数

函数返回时会返回两个值:1.真正的结果 2.错误信息

指针

主要用途:

对于传入参数进行修改。对值修改时需要使用指针,才能起作用,因为函数中所传入的值只是进行的一个拷贝,而指针类型才能达到对于值本身的改变

结构体

可以用结构体名称去初始化一个结构体变量,构造的时候需要传入每个字段的初始值

结构体方法

比较类似类成员函数,实现方法:1.带指针(对成员本身进行修改)3.不带指针(只进行值的修改)

错误处理

在函数里,可以在函数的返回值后面加一个error,就代表这个函数可能会返回错误

return &u,error.New("not found")

字符串操作

*contains 判断一个字符串里是否还包含另一个字符串 *count 字符串计数 *index 查找某个字符串的位置 *join 连接多个字符串 *repeat 重复多个字符串 *replace 替换字符串