文章目录
1.configure
- 下载vscode&Go
go - 设置gopath
go env -w GOPATH=/Users/bytedance/go
go env -w PATH=/Users/bytedance/bin
- 设置goMod状态,goMod google
go env -w GOPROXY=https://goproxy.cn,direct
1.1Go语言了解
1.2 vscode+go
在vs code进入指定code编译环境
- mac terminal终端打开文件所在目录
code .
- 先编译再运行
(进入hello.go所在文件)
go build hello.go
./hello
- 或直接run脚本
go run hello.go
1.3 go 项目管理
go mod init hello(在hello.go同级文件下)
go env (查看Go环境)
2.常用语法
2.1 go定义变量
package main
import "fmt"
/*定义全局变量*/
var global1 = 100
var global2 = 200
//func 是关键字,表示是一个函数
func main() {
fmt.Println("姓名 \t年龄 \r")
//fmt.Println("name \tage")
//定义变量1
var i int
//i = 11
fmt.Println("i=", i)
//定义变量2
name := "hhhh"
fmt.Println("name", name)
/* 一次性申请多个变量*/
var n1, name2, x = 100, "jack", 88
fmt.Println(x, name2, n1)
}
2.2 "+"号 字符类型
- go也可以实现字符串拼接
- float 32 float64
- 无字符型,用byte保存单个字母字符(utf8编码)
- int,int8,int16…uint,uint32…
- bool类型
- string为基本类型,字符串一旦确定就不能更改
- go里面函数也是一种数据类型
- map也是类型
【highlight】
查看数据类型和大小 - golang默认64位浮点数
fmt.Print有几个变种:
Print: 输出到控制台,不接受任何格式化操作
Println: 输出到控制台并换行
Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出别的类型)
Sprintf:格式化并返回一个字符串而不带任何输出
Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout
2.3 字符串转换
/*字符串转数字
// ParseInt 将字符串转换为 int 类型
// s:要转换的字符串
// base:进位制(2 进制到 36 进制)
// bitSize:指定整数类型(0:int、8:int8、16:int16、32:int32、64:int64)
// 返回转换后的结果和转换时遇到的错误
// 如果 base 为 0,则根据字符串的前缀判断进位制(0x:16,0:8,其它:10)
func ParseInt(s string, base int, bitSize int) (i int64, err error)
*/
var newstr string = "12345"
var aa int64
aa, _ = strconv.ParseInt(newstr, 10, 64)
fmt.Println(aa)
2.4 JSON序列化与反序列化
package main
import (
"encoding/json"
"fmt"
)
//json序列化
type Student struct {
Id int `json:"stuid"`
Name string `json:"stuname"`
}
type Class struct {
Title string
Mystudents []Student //切片
}
func main() {
//创建一个班级结构体
C1 := Class{
Title: "101班",
Mystudents: make([]Student, 0, 20),
}
for i := 0; i < 10; i++ {
//由于添加的是结构体,所以需要封装一下
var temp Student
temp.Id = i
/*实例化结构体法二:
stu := Stu{
Name: "张三",
Age: 18,
HIgh: true,
sex: "男",
}*/
//sprintf格式化字符串
temp.Name = fmt.Sprintf("stu%02d", i)
C1.Mystudents = append(C1.Mystudents, temp)
}
fmt.Printf("%v\n", C1)
//json序列化:GO语言中数据->JSON格式的字符串
data, err := json.Marshal(C1)
if err != nil {
fmt.Println("json marshal failed:", err)
return
}
//json为字符串
fmt.Printf("%s\n", data)
//json反序列化:JSON格式字符串转为GO语言数据
jsonstr := `{
"Title":"101班",
"Mystudents":[
{
"stuid":0,
"stuname":"stu00"
},
{
"stuid":1,
"stuname":"stu01"
}]
}`
var c2 Class
json.Unmarshal([]byte(jsonstr), &c2)
if err != nil {
fmt.Printf("json unmarshal failed")
}
fmt.Printf("%v\n", c2)
}
2.5 defer用法
链接
函数返回的过程是这样的:先给返回值赋值,然后调用defer表达式,最后才是返回到调用函数中。
2.6 方法&函数
在Go语言中,函数是指不属于任何结构体、类型的方法,也就是说,函数是没有接收者的;而方法是有接收者的,我们说的方法要么是属于一个结构体的,要么属于一个新定义的类型的。
在Go语言中,函数是指不属于任何结构体、类型的方法,也就是说,函数是没有接收者的;而方法是有接收者的,我们说的方法要么是属于一个结构体的,要么属于一个新定义的类型的。
2.7 值类型接收&指针类型接收
-
当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。
-
指针类型的接收者由一个结构体的指针组成,由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。这种方式就十分接近于其他语言中面向对象中的this或者self。 例如我们为Person添加一个SetAge方法,来修改实例变量的年龄。
2.8 sql的占位符"?"
现在的数据库系统都提供SQL语句的预编译(prepare)和查询参数绑定功能,在SQL语句中放置占位符’?’,防止注入攻击
参考1
2
bindvars的一个常见误解是,它们用来在sql语句中插入值。它们其实仅用于参数化,不允许更改SQL语句的结构。例如,使用bindvars尝试参数化列或表名将不起作用:
// ?不能用来插入表名(做SQL语句中表名的占位符)
db.Query("SELECT * FROM ?", "mytable")
// ?也不能用来插入列名(做SQL语句中列名的占位符)
db.Query("SELECT ?, ? FROM people", "name", "location")
2.9 sql按原表格顺序排序
link
首先,in 查询 是查询范围的 比如我有个 article表
查询
select * from article where id in(1,5,3);
这样查询来它默认是 按 id升序排列的。
如果我们想要保持传入的顺序,怎么办呢?
用 find_in_set吧
看:
select * from article where id in(1,5,3) ORDER BY FIND_IN_SET(‘id’,‘1,5,3’);
这样的好处是 我可以把这个排序 存在别的表的某个字段,做关联。
当然也等同于
select * from article where id IN(1,5,3) ORDER BY field(id,‘1’,‘5’,‘3’);
用上面的 如果排序 和查询 用的是 字符串字段 就方便点。
2.10 接口
2.10.1 空接口
空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口
空接口类型的变量可以存储任意类型的变量。
func main() {
// 定义一个空接口x
var x interface{}
s := "Hello 沙河"
x = s
fmt.Printf("type:%T value:%v\n", x, x)
i := 100
x = i
fmt.Printf("type:%T value:%v\n", x, x)
b := true
x = b
fmt.Printf("type:%T value:%v\n", x, x)
}
空接口的应用
空接口作为函数的参数
使用空接口实现可以接收任意类型的函数参数。
// 空接口作为函数参数
func show(a interface{}) {
fmt.Printf("type:%T value:%v\n", a, a)
}
空接口作为map的值
使用空接口实现可以保存任意值的字典。
// 空接口作为map值
var studentInfo = make(map[string]interface{})
studentInfo["name"] = "沙河娜扎"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)
var m map[string]interface{} //声明变量,不分配内存
m = make(map[string]interface{}) //必可不少,分配内存
m["name"] = "simon"
3 网络相关
3.1 net/http
link
http.Post
要以 POST 的方式发送数据,也很简单,只需调用 http.Post() 方法并依次传递下面这 3 个参数即可:
请求目标的 URL
POST 请求数据的资源类型(MIMEType)
数据的比特流([]byte 形式)