这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
优点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 标准库丰富
- 工具链丰富
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
基础变量
变量声明:
var name = value
var s = "s"
常量:
const name = value
const s string = "aa"
= 是赋值 := 是声明变量并赋值
语句
if
if 条件 {
}
if 条件 {
}else{
}
for
for i:=0 ; i<10 ; i++ {
}
//continue;
//break;
switch
switch a{
case 1 :
..
case 2 :
..
defalt:
..
}
数组
var a [5]int
var a [2][3]int
切片
var s []type = make([]type, len)
s := make([]string,3)
s = append(s,"d") //添加
copy(目标切片,源头切片)
s[0:2] //取出 (前闭后开)
s := []string{"a","b","c"} //s[0]="a"..
map
m := make(map[string]int)
m["hello"]=1
r,ok:= m["hello"] //是否存在 r=1,ok=true
delete(m,"hello") //删除
range
m := make(map[string]int)
m["hello"] = 1
m["hi"] = 2
m["say"] = 3
for k, v := range m {
fmt.Println(k, v)
}
/**
hello 1
hi 2
say 3
*/
函数
//支持多返回值
func f1(a int, b int) int{
return a + b
}
func f2(m map[string]int, k string)(v int, ok bool){
v, ok = m[k]
return v,ok
}
/**
println(f2(m, "hello"))
1 true
*/
指针
func f1(a *int, b *int) int{
a += b
b += a
return a + b
}
f1(&a,&b)
结构体
type stu struct {
name string
no int
}
func main() {
a := stu{"liming",1}
b := stu{name:"qiqi"}
b.no = 1
}
结构体方法
type stu struct {
name string
no int
}
func (s stu) printStu(name string, no int) {
println(s.name, s.no)
}
func main() {
a := stu{"liming", 1}
b := stu{name: "qiqi"}
b.no = 1
a.printStu(a.name, a.no)
}
错误处理
此处结果返回值必须为引用类型,会存在空指针情况
type stu struct {
name string
no int
}
func f3(stus []stu, name string) (stu *stu, err error) {
for _, v := range stus {
if v.name == name {
return &v, nil
}
}
return nil, errors.New("未找到")
}
func main() {
var a = stu{name: "hello", no: 1}
var b = stu{name: "hello2", no: 1}
c := []stu{a, b}
v, e := f3(c, "hello")
fmt.Println(v, e)
v, e = f3(c, "hello7")
fmt.Println(v, e)
}
/**
&{hello 1} <nil>
<nil> 未找到
*/
字符串格式化
格式化输出函数为printf
func main() {
var a = stu{name: "hello", no: 1}
var b = stu{name: "hello2", no: 1}
c := []stu{a, b}
v, e := f3(c, "hello")
fmt.Printf("v=%v\ne=%v\n", v, e)
fmt.Printf("+v=%+v\ne=%v\n", v, e)
fmt.Printf("#v=%#v\ne=%v\n", v, e)
fmt.Printf("%.2f", 2.336)
}
/**
v=&{hello 1}
e=<nil>
+v=&{name:hello no:1}
e=<nil>
#v=&main.stu{name:"hello", no:1}
e=<nil>
2.34
*/
JSON处理
结构体属性第一个字符必须大写
type stu struct {
Name string
No int
}
func main() {
a := stu{Name: "liming", No: 1}
buf, err := json.Marshal(a)
if err == nil {
println(string(buf))
}
var b stu
err = json.Unmarshal(buf, &b)
if err == nil {
fmt.Printf("%v", b)
}
}
/**
{"Name":"liming","No":1}
{liming 1}
*/
时间处理
导包 time
func main() {
now := time.Now()
fmt.Println(now)
//自行构造时间
t := time.Date(2022, 3, 15, 11, 25, 36, 0, time.UTC)
t2 := time.Date(2023, 3, 15, 11, 25, 36, 0, time.UTC)
fmt.Println(t)
fmt.Println(t.Year())
//格式化 必须为这个时间
fmt.Println(t.Format("2006-01-02 15:04:05"))
//日期差
diff := t2.Sub(t)
fmt.Println(diff)
diff.Hours()
//转化为时间类型
t3, err := time.Parse("2006-01-02 15:04:05", "2017-08-06 17:15:16")
if err == nil {
fmt.Println(t3)
}
//获取时间戳
fmt.Println(now.Unix())
}
/**
2022-05-07 13:24:09.7027718 +0800 CST m=+0.002074101
2022-03-15 11:25:36 +0000 UTC
2022
2022-03-15 11:25:36
8760h0m0s
2017-08-06 17:15:16 +0000 UTC
1651901049
*/
字符串数字转化
import "strconv"
func main() {
f, _ := strconv.ParseFloat("1.3254", 64)
println(f)
//进制为0表示去推测进制 最后一个参数为位数
n, _ := strconv.ParseInt("12006", 10, 64)
println(n)
nn, _ := strconv.Atoi("123")
println(nn)
i := strconv.Itoa(123)
println(i)
}
/**
+1.325400e+000
12006
123
123
*/