Go语言基础语法 | 青训营

70 阅读4分钟

Go语言基础

Go语言结构

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句
  • 注释
package main

import "fmt"

func main() {
   /* 这是我的第一个简单的程序 */
   fmt.Println("Hello, World!")
}
  1. package main 定义包名.package main表示一个可独立执行的程序,每个Go应用程序都包含一个名为main的包

  2. import "fmt"告诉编辑器使用的是fmt这个包的函数,fmt包实现了格式化IO的函数

  3. 每个Go程序都包含main函数

  4. Go语言中{不能单独处在一行

  5. 每个语句之后不需要以;结尾

变量

声明变量用var :var a1, a2 int = 1, 2

如果没初始化,这变量默认为零值.

var会自行判定变量类型

如果已经使用var声明过了,再使用:=声明,则会产生err

语句inVal := 1 等于

var inVal int

inVal = 1

局部变量被声明后必须被使用

常量

const a1 int = 10

枚举

const {
  unknow = 0
  female = 1
  male = 2
}

配合关键字iota

const {
  a = iota // 0
  b //1
  c //2
  d = "ha" //独立 iota += 1
  e //“ha” iota += 1
  f = 100 //100 iota += 1
  g //100 iota += 1
  h = iota //7 恢复
  i = //8
}

运算符

  • 算术运算符:和C一样
package main

import "fmt"

func main() {

   var a int = 21
   var b int = 10
   var c int

   c = a + b
   fmt.Printf("第一行 - c 的值为 %d\n", c )
   c = a - b
   fmt.Printf("第二行 - c 的值为 %d\n", c )
   c = a * b
   fmt.Printf("第三行 - c 的值为 %d\n", c )
   c = a / b
   fmt.Printf("第四行 - c 的值为 %d\n", c )
   c = a % b
   fmt.Printf("第五行 - c 的值为 %d\n", c )
   a++
   fmt.Printf("第六行 - a 的值为 %d\n", a )
   a=21   // 为了方便测试,a 这里重新赋值为 21
   a--
   fmt.Printf("第七行 - a 的值为 %d\n", a )
}
/*
第一行 - c 的值为 31
第二行 - c 的值为 11
第三行 - c 的值为 210
第四行 - c 的值为 2
第五行 - c 的值为 1
第六行 - a 的值为 22
第七行 - a 的值为 20
*/
  • 关系运算符 : 和C一样

    package main
    
    import "fmt"
    
    func main() {
       var a int = 21
       var b int = 10
    
       if( a == b ) {
          fmt.Printf("第一行 - a 等于 b\n" )
       } else {
          fmt.Printf("第一行 - a 不等于 b\n" )
       }
       if ( a < b ) {
          fmt.Printf("第二行 - a 小于 b\n" )
       } else {
          fmt.Printf("第二行 - a 不小于 b\n" )
       } 
       
       if ( a > b ) {
          fmt.Printf("第三行 - a 大于 b\n" )
       } else {
          fmt.Printf("第三行 - a 不大于 b\n" )
       }
       /* Lets change value of a and b */
       a = 5
       b = 20
       if ( a <= b ) {
          fmt.Printf("第四行 - a 小于等于 b\n" )
       }
       if ( b >= a ) {
          fmt.Printf("第五行 - b 大于等于 a\n" )
       }
    }
    /*
    第一行 - a 不等于 b
    第二行 - a 不小于 b
    第三行 - a 大于 b
    第四行 - a 小于等于 b
    第五行 - b 大于等于 a
    */
    
  • 逻辑运算符 : 和C一样

  • 赋值运算符

package main

import "fmt"

func main() {
   var a int = 21
   var c int

   c =  a
   fmt.Printf("第 1 行 - =  运算符实例,c 值为 = %d\n", c )

   c +=  a
   fmt.Printf("第 2 行 - += 运算符实例,c 值为 = %d\n", c )

   c -=  a
   fmt.Printf("第 3 行 - -= 运算符实例,c 值为 = %d\n", c )

   c *=  a
   fmt.Printf("第 4 行 - *= 运算符实例,c 值为 = %d\n", c )

   c /=  a
   fmt.Printf("第 5 行 - /= 运算符实例,c 值为 = %d\n", c )

   c  = 200; 

   c <<=  2
   fmt.Printf("第 6行  - <<= 运算符实例,c 值为 = %d\n", c )

   c >>=  2
   fmt.Printf("第 7 行 - >>= 运算符实例,c 值为 = %d\n", c )

   c &=  2
   fmt.Printf("第 8 行 - &= 运算符实例,c 值为 = %d\n", c )

   c ^=  2
   fmt.Printf("第 9 行 - ^= 运算符实例,c 值为 = %d\n", c )

   c |=  2
   fmt.Printf("第 10 行 - |= 运算符实例,c 值为 = %d\n", c )

}
/*
第 1 行 - =  运算符实例,c 值为 = 21
第 2 行 - += 运算符实例,c 值为 = 42
第 3 行 - -= 运算符实例,c 值为 = 21
第 4 行 - *= 运算符实例,c 值为 = 441
第 5 行 - /= 运算符实例,c 值为 = 21
第 6行  - <<= 运算符实例,c 值为 = 800
第 7 行 - >>= 运算符实例,c 值为 = 200
第 8 行 - &= 运算符实例,c 值为 = 0
第 9 行 - ^= 运算符实例,c 值为 = 2
第 10 行 - |= 运算符实例,c 值为 = 2
*/

条件语句

if a > 10{
  	a++
  if a <= 10{
    a--
  }
}

if a > 10{
  a++
}else{
  a--
}

循环语句

for i = 0;i < 100;i++{
  fmt.Printf("%d",i)
}

函数

func max(num1, num2 int) int {
  //函数体
}

/*
结构:
func函数声明 函数名(参数) 返回类型{
	函数体
}
*/

数组

  • 声明(初始化)数组

    var arr [10]int
    arr := [5]int{1,2,3,4,5}
    var arr [5]int{1,2,3,4,5}
    
  • 当数组长度不确定时

    var arr [...]int{1,2,3,4}
    

指针

var ip *int

==空指针是nil==

结构体

type Books struct{
  title string
  author string
  book_id int
}

切片

数组的长度不可变的时候可能有些情况不适用

  • 定义切片

    var arr []int //未指定数组长度来定义切片
    
    var slice1 []int = make([]int,LEN) //make()函数创建切片
    //or
    slice1 := maek([]int,LEN)
    
  • 初始化切片

    s :=[] int {1,2,3} // []表示切片类型
    

    ==未初始化之前的切片默认为nil,长度为0==

  • 切片截取

    fmt.Printf("number[1:4]",numbers[1:4])
    

范围

关键字range

格式:

for key, value := range oldMap{
  newMap[key] = value
}
//or
for key := range oldMap

Map(集合)

  • 定义map

    格式:
    map_variable := make(map[KeyType]ValueType, initialCapacity)
    //创建一个空的map
    m := make(map[string]int)
    //创建一个初始容量为10的map
    m := make(map[string]int,10)
    
    
    //使用字面量创建map
    m := map[string]int{
      "apple": 1,
      "banana": 2,
    }
    //获取键值对
    v1 := m["apple"]
    //修改
    m["apple"] = 5
    //获取map长度
    len := len(m)
    //遍历map
    for k,v := range m{
      fmt.Printf("key=%s")
    }
    //删除键值对
    delete(m,"banana")
    
    

类型转换

格式:type_name(expression)

举个栗子

var a int = 10
var b float64 = float64(a)