开箱一个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
    )
  1. 多变量可以在同一行进行赋值,如:
var a, b int
var c string
a, b, c = 5, 7, "abc"
// 如果没有被调用,可以直接
a, b, c := 5, 7, "abc"
  1. 引用类型写作 (ref)r1,r1 就为引用类型的变量
  2. 空白标识符:
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 的类型 :<nil>

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 框架一天搞完课设,然后一天实验报告,剩下时间全部刷高数)

本文链接:https://ariser.cn/index.php/archives/125/
本站文章采用 知识共享署名4.0 国际许可协议进行许可,请在转载时注明出处及本声明!

评论已关闭