数据类型
说明最开始我们只需要关注基础类型即可
基础类型:数字,字符串,布尔类型
数字类型包括
变量/常量声明
//比较完整的方式
var a string = "hello go"
var a bool = true
var a int = 12
const PI int = 3.14
//我们尽量简短,所以我们更加推荐下边的写法
a:=32
var a = "hello go"
var a = true
var a = 12
const PI = 3.14
运算符
算术运算 :
运算符 | 说明 |
---|---|
+ - * / | 加减乘除 |
% | 取余 |
++/– | 自增 |
关系运算:
运算符 | 说明 |
---|---|
> < >= <= | 大小比较 |
!= | 不等于 |
== | 值的比较 |
逻辑运算
运算符 | 说明 |
---|---|
&& | 与 |
|| | 或 |
! | 非 |
位运算:
运算符 | 说明 |
---|---|
& | 加减乘除 |
| | 取余 |
^ | 自增 |
>> | 右移 |
<< | 左移 |
条件循环
go语言的判断语句是不加括号的
if
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
switch
go语言的switch是匹配之后自动结束的
var grade string = "B"
var marks int = 90
switch marks {
case 90: grade = "A"
case 80: grade = "B"
case 50,60,70 : grade = "C"
default: grade = "D"
}
循环
go语言只有for循环,没有while,do while之类的
for init; condition; post { }
for condition { }
for { }
循环控制关键字
break
continue
goto
容器
go的容器包含数组,切片,map
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
var slice1 []type = make([]type, len)
也可以简写为
slice1 := make([]type, len)
countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}
函数定义
func function_name( [parameter list] ) [return_types] {
函数体
}
面向对象
type Books struct {
title string
author string
subject string
book_id int
}
func main() {
// 创建一个新的结构体
fmt.Println(Books{"Go 语言", "", "Go 语言教程", 6495407})
// 也可以使用 key => value 格式
fmt.Println(Books{title: "Go 语言", author: "", subject: "Go 语言教程", book_id: 6495407})
// 忽略的字段为 0 或 空
fmt.Println(Books{title: "Go 语言", author: ""})
}
接口
type Animal interface {
call()
}
type Frog struct {
}
func (frog Frog) call() {
fmt.Println("gua gua gua")
}
type Cuckoo struct {
}
func (cuckoo Cuckoo) call() {
fmt.Println("布谷 布谷")
}
func main() {
var animal Animal
phone = new(Frog)
phone.call()
phone = new(Cuckoo)
phone.call()
}
错误处理
Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
error类型是一个接口类型,这是它的定义:
type error interface {
Error() string
}
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
}
// 实现
}
result, err:= Sqrt(-1)
if err != nil {
fmt.Println(err)
}
模块化
1.5
版本之前的go
,go get
命令会将包会下载到GOPATH
路径中1.5
及以上版本,添加了 依赖的组织名- vgo 被提议作为 Go 模块支持的原型
- Go 1.11 (beta) 版本中,
vgo
被合并到主干代码并改进为go mod
( 实验性质 )
在项目中使用
在一个空的文件夹中,使用go mod init
初始化生成 go.mod 文件。
go.mod 文件一旦创建后,它的内容将会被 go toolchain 全面掌控,go toolchain 会在各类命令执行时,比如go get
、go build
、go mod
等修改和维护 go.mod 文件。
go.mod 提供了 module、require、replace 和 exclude 四个命令:
- module 语句指定包的名字(路径);
- require 语句指定的依赖项模块;
- replace 语句可以替换依赖项模块;
- exclude 语句可以忽略依赖项模块。
新建main文件
package main
import (
"net/http"
"/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
}
改造项目
├─ main.go
│
└─ api
└─ apis.go
package main
import (
api "hello/api" // 这里使用的是绝对对路径
"/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", api.HelloWorld)
e.Logger.Fatal(e.Start(":1323"))
}
package api
import (
"net/http"
"/labstack/echo"
)
func HelloWorld(c echo.Context) error {
return c.JSON(http.StatusOK, "hello world")
}