开箱一个Go语言

前言

一学期一度的课程设计来咯,这次Web课程设计,依旧是各种xxx管理系统,继续拿PHP搞一通很快就搞完了,没啥意思(其实后面如果go不下去,可能会PHP真香)。准备用Beego,目前的认知的是一种为微服务而生的框架。先开箱Go,了解基本语法。

下面是开箱的全过程。

go学习笔记

语言变量

  1. import一个包之后,不能不使用,否则应该写作 import _ "fmt"

  2. 正括号不能写到下一行

  3. 声明了变量,必须要使用,否则会编译错误

  4. ''单引号,指的是rune类型,也就是C中的char。var a = 'a'

  5. Println: 可以打印出字符串,和变量,自带换行。

  6. Printf: 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形

  7. int、string、bool没有赋值时,分别对应0,,false

  8. fmt.Printf("%v %v %v %q\n", int, float64, bool, string)

  9. := 是声明并赋值,并且系统自动推断类型,不需要var关键字。如d := 100 ,d 不能是已经声明过的

  10. 这种因式分解关键字的写法一般用于声明全局变量

    var (
            a int
            b bool
        )
    
  11. 多变量可以在同一行进行赋值,如:

    var a, b int
    var c string
    a, b, c = 5, 7, "abc"
    // 如果没有被调用,可以直接
    a, b, c := 5, 7, "abc"
    
  12. 引用类型写作 (ref)r1,r1就为引用类型的变量

  13. 空白标识符:

    func main() {
      _,numb,strs := numbers() //只获取函数返回值的后两个
      fmt.Println(numb,strs)
    }
    
    //一个可以返回多个值的函数
    func numbers()(int,int,string){
      a , b , c := 1 , 2 , "str"
      return a,b,c
    }
    

语言常量

可以理解为静态变量
常量的定义格式:

const identifier [type] = value
const b string = "abc" // 显式
const b = "abc" // 隐式

常量还可以用作枚举:

const (
    Unknown = 0
    Female = 1
    Male = 2
)

iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式:

const (
    a = iota
    b
    c
)

牛掰但是还没理解的用法:传送门,看最后几行

远算符

加减乘除什么的都一样用
位运算符号,参见菜鸟教程
同C,有取地址符号&,和指针变量*

键盘输入

fmt.Scan(&b)

条件语句

if

不写括号

if a > 0 {
    if a == 3 {
        ///
    }
    ///
} else {
    ///
}

switch

默认case后面自动执行break,
使用fallthrough,会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true传送门的最后。

var grade string = "B"
var marks int = 90

switch marks {
  case 90: 
    grade = "A"
    fallthrough
  case 80: grade = "B"
  case 50,60,70 : grade = "C"
  default: grade = "D"  
}

用于判断某个 interface 变量中实际存储的变量类型

var x interface{}
     
switch i := x.(type) {
  case nil:   
     fmt.Printf(" x 的类型 :%T",i)                
  case int:   
     fmt.Printf("x 是 int 型")                       
  case float64:
     fmt.Printf("x 是 float64 型")           
  case func(int) float64:
     fmt.Printf("x 是 func(int) 型")                      
  case bool, string:
     fmt.Printf("x 是 bool 或 string 型" )       
  default:
     fmt.Printf("未知型")     
}  
// 结果为:x 的类型 :

Select

直接看详细:传送门

循环语句

看实例


var b int = 15
var a int

// for循环不加括号   
for a := 0; a < 10; a++ {
  fmt.Printf("a 的值为: %d\n", a)
}

// 相当于while
for a < b {
  a++
  fmt.Printf("a 的值为: %d\n", a)
}

numbers := [6]int{1, 2, 3, 5} 
// 相当于foreach,有点没理解
for i,x:= range numbers {
  fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
}   

还有break、continue、goto,直接传送门

函数

  1. 至少得有一哥main()函数
  2. Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。

函数格式如下:

func function_name( [parameter list] ) [return_types] {
   函数体
}
// 函数名(参数列表)返回值类型

实例:

/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {
   /* 声明局部变量 */
   var result int

   if (num1 > num2) {
      result = num1
   } else {
      result = num2
   }
   return result 
}

可以返回多个值

func swap(x, y string) (string, string) {
   return y, x
}

func main() {
   a, b := swap("Google", "Runoob")
   fmt.Println(a, b)
}

参数传递和函数用法

值传递 和 引用传递(和C语言一样,直接改变地址对应的值)
函数作为另外一个函数的实参、闭包、方法

全局变量

传送门

数组

定义格式:

var balance [10] float32

初始化:

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

未知大小数组:

var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
var salary float32 = balance[9]

多维数组

Go 语言向函数传递数组

传送门

指针、结构体、Range、Map、接口、并发

传送门

Go中没有明确指出面向对象概念,借助结构体struct实现,用interface实现接口,具体传送门

成员方法(类里面的方法)的实现:

type Person struct {
  name string
  age int
}

person := Person{"mike",18}
fmt.Println(person)

func (person *Person) showInfo() {
    fmt.Printf("My name is %s , age is %d ",person.name,person.age)
}

func (person *Person) setAge(age int) {
    person.age = age
}

person := Person{"mike",18}
person.showInfo()
person.setAge(20)
fmt,Println(person)

在关键字func和函数名之间加上一对小括号,写上与之关联的结构体类型指针类型变量名推荐写成指针类型的原因是,函数传递的形参不是指针类型的话,无法覆盖实参。【直接copy的】

继承和多态,见传送门

总结

GO还是比较优雅的,有种用Python的简介化封装C语言的感觉,其余的后面用多了再说。尝试一种新语言或框架,有一种开箱一个新的电子产品的感觉。

上面的基础内容,应该掌握,就可以开始搞事了。(我是花了四小时进行学习和整理文档的)

唉,考研还瞎折腾这些,有种出轨的感觉。。。(正确姿势应该是用是用到烂的php框架一天搞完课设,然后一天实验报告,剩下时间全部刷高数)

你可能感兴趣的:(开箱一个Go语言)