golang基础语法 | 青训营笔记

125 阅读3分钟

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

golang基础语法

  • 变量定义

    使用关键字var进行定义,后面接变量名称和变量类型

    var a int
    var b string
    

    统一定义

    var (
    a int
    b string
    )
    

    快速声明,可以根据后面的内容自动推断变量类型

    a := 123
    b := "golang"
    
  • 常量定义

    使用关键字const,后接常量名称,进行直接赋值,不需要指定变量类型

    const x = 123
    const str = "golang"
    
  • 算数运算符

    与其他语言类似,支持加、减、乘、除,取余,自增,自减操作,不同的是go只有后置的自增、自减

    a+b
    a*b
    a-b
    a/b
    a%b
    a++
    b--
    
  • 运算符

    == 等于
    != 不等于
    >  大于
    <  小于
    >= 大于等于
    <= 小于等于
    && 与运算符
    || 或运算符
    ! 取反运算符
    
  • 分支结构

    • if-else

    if 条件不用加括号,必须为bool类型

    if true{
    执行
    }else{
    不执行
    }
    
    if (){
    ​
    }else if(){
    ​
    }else{
    ​
    }
    
    • switch-case

      每个case后面自带break

      switch x{
      	case 1:
      	case 2:
          default:
      }
      
  • 循环

    golang中只有for循环

    for{
    ​
    }//不设定条件的for循环
    for i := 4; i < 7; i ++{
    ​
    } //有条件的for循环
    
  • 数组

    • 表示存放5个int类型的数组
    var x [5]int   
    a[4] = 6
    len(a)   //数组a的长度
    b := [5]int{2,3,4} //定义数组的同时进行初始化
    
    • 二维数组

      var x = [3][2]int
      
  • 切片

    创建切片

    s := make([]string,3)   
    s = s.append("xxx") //append  添加,赋值回原数组
    len(s)  //s的长度
    c := make([]string,len(s))
    copy(c,s)  // 把s复制给c
    s[1:3]  //s[1],s[2]
    s[:3]   //s[0],s[1],s[2]
    s[2:]   //s[2]....s[len(s)-1]
    
  • map

    m := make(map[string]int)  //创建一个map
    m["xxx"] = 1  //通过方括号插入键值对
    m["xxx"]   //通过方括号读取键值对
    delete(m,"xxx")  //删除键值对
    
  • range

    对以一个slice或map可以使用range进行更加简单的遍历

    • 数组
    var x = [5]int
    for i,num = range x{
    ​
    }// i下标, num是x[i]的值
    
    • map
    m := make(map[String]int)
    for k,v = range m{
        
    }//k map的键值, v s是map[k]
    
  • 函数

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

    golang中的函数可以返回多个值,

    第一个值返回真正的结果,第二个值返回错误信息

    func exists(m map[string]string,k string) (v string,ok bool){
        v,ok = m[k]
        return v,ok
    }
    
  • 指针

    golang中的指针的用处非常有限,常用在对参数的修改

    func add(n int){
        n+=2
    } // 不能改变n的值
    func add(n *int){
        *n+=2
    }//可以改变n的值func main(){
        n := 5
        add(&n) //调用时
    }
    
  • 结构体

    type user struct{
        username string
        password string
    }
    ​
    func main(){
        a := user{name:"xxx",password:"1555"}
        b := user{"xxx","555"}
        c := user{name:"xxx"}
        c.password = "55"
        var d user
        d.username = "xxx"
        d.password = "885"
        
    }
    

    结构体也可作为函数的参数,同时有指针和非指针之分

    • 结构体方法

      func (u user) checkpassword(password string) bool{
          return u.password == password
      }
      func (u *user) resetusername(username string) {
          u.username = username 
      }
      
  • 错误处理

    使用返回值来返回异常

    func findUser(users []user,name string) (v *user,err error){
        for _,u := raneg users{
        if u.username == name{
        return &u,nil
        }
        }
        return nil,errors.New("Not Found")
    }
    
  • 字符串操作

    a := "hello"
    strings.Contains(a,"ll")  //包含某个字符串
    strings.Count(a,"l")        //计算有多少个字符窜
    strings.HasPrefix(a,"he")   //是否是以该字符串为前缀
    strings.HasSuffix(a,"lo")  //是否以该字符串为后缀
    strings.Index(a,"l")    //查找字符串在a中的位置
    strings.Join([]string{"he","llo"},"-")//he-llo
    strings.split("a-b-c","-") [a,b,c]
    
  • JSON操作

    type userInfo struct{
        Name string
        Age int
        Hobby []string
    }
    //结构体中的每个变量首字母大写
    json.Marshal()  //序列化
    josn.Unmarshal(a,&b)  //b是反序列化之后的值