开箱一个Go语言
前言
一学期一度的课程设计来咯,这次Web课程设计,依旧是各种xxx管理系统
,继续拿PHP
搞一通很快就搞完了,没啥意思(其实后面如果go
不下去,可能会PHP真香
)。准备用Beego
,目前的认知的是一种为微服务而生的框架。先开箱Go
,了解基本语法。
下面是开箱的全过程。
go学习笔记
语言变量
-
import
一个包之后,不能不使用,否则应该写作import _ "fmt"
-
正括号不能写到下一行
-
声明了变量,必须要使用,否则会编译错误
-
''
单引号,指的是rune
类型,也就是C中的char。var a = 'a'
-
Println: 可以打印出字符串,和变量,自带换行。
-
Printf: 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形
-
int、string、bool
没有赋值时,分别对应0,,false
-
fmt.Printf("%v %v %v %q\n", int, float64, bool, string)
-
:=
是声明并赋值,并且系统自动推断类型,不需要var关键字。如d := 100
,d 不能是已经声明过的 -
这种因式分解关键字的写法一般用于声明全局变量
var ( a int b bool )
-
多变量可以在同一行进行赋值,如:
var a, b int var c string a, b, c = 5, 7, "abc" // 如果没有被调用,可以直接 a, b, c := 5, 7, "abc"
-
引用类型写作
(ref)r1
,r1就为引用类型的变量 -
空白标识符:
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,直接传送门
函数
- 至少得有一哥
main()
函数 - 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框架一天搞完课设,然后一天实验报告,剩下时间全部刷高数)