Golang 学习笔记技术
golang 学习笔记,语法特点,快速入门,一小时入门。
花括号 { 不可以单独一行
不需要加分号
import 合并写法
import "fmt"
import {
"fmt"
"time"
}变量声明
// 1
var a int
// 默认为 0
// 2
var b int = 1
// 3
var c = 1
// 4 只能使用在函数内
d := 1
// 打印类型
fmt.Printf("%T\n", d)
// 5 声明多个
var a, b int = 1, 2
var x, y = 1, "a"
var (
a int = 1
b bool = true
)常量 iota
const a int = 1 // iota 使用在 const 括号内 const ( X = iota //0 Y //1 Z //2 )
多返回值
func f1(a string, b int) (int, int) {
fmt.Println(a)
fmt.Println(b)
return 1, 2
}
func f2(a string, b int) (x int, y int) {
fmt.Println(a)
fmt.Println(b)
x = 1
y = 2
return
}
func f3(a string, b int) (x, y int) {
fmt.Println(a)
fmt.Println(b)
x = 1
y = 2
return
}
r1, r2 = f4("f4", 4)
fmt.Println(r1, r2)执行顺序 package import const var init main
别名
import (
_ "project/test" // 导入不使用 匿名别名
test2 "project/test2" // 定义别名
. "project/test3" //去除别名前缀
)二级指针
var pp = **int // 为什么要出现二级?指针的指针也是指针啊
defer 先进后出,函数执行完成后执行。
var arr [10]int // 默认为 0
arr2 := [5]int{1,2,3}
// 遍历
for i:= 0; i< len(arr); i++ {
}
// 遍历
for index, value := range arr {
}
切片
slice := []int{1,2,3}
var s2 []int
slice2 = make([]int, 3)
var s3 []int = make([]int, 3)
s4 := make([]int, 3)
var s5 = make([]int, 3, 5) // len 3, cap 5
s5 = append(s5, 1) // 追加
s5 = append(s5, 2) // 这个语法挺不能理解的,为什么要赋值
s6 := s5[:] // 使用冒号:来截取
// 使用 copy 来拷贝map
var m1 map[string]string
m1 = make(map[string]string, 8)
m1["name"] = "Nico"
m1["age"] = "15"
m2 := make(map[int]string)
m2[1] = "nico"
m2[2] = "bosco"
m3 := map[string]string {
"name": "bee"
}
delete(m3, "name") // 使用 delete 删除
// map 和切片 默认是指针,传递引用type 结构体
type alias_int int //定义别名
type Person struct {
name string
age int
}struct 调用方法
func (t *Person) Show() {
fmt.Println(t.name, t.age)
}
func main() {
per := Person(name:"x", age:20)
per.Show() // 像类一样调用 首字母大写共有,小写私有
}
// 继承
type RichMan struct {
Person
money string
}
interface
type Test interface {
t1()
t2()
}
// 子类实现了接口全部方法即可实现
// interface{} 是万能数据类型 空接口
arg.(string) 类型判断 断言reflect
varType := reflect.TypeOf(var)
varValue := reflect.ValueOf(var)
// 获取属性
for i:=0; i<varType.NumField(); i++ {
varType.Field(i)
varValue.Field(i).Interface()
}
// 获取方法
for i:=0; i<varType.NumMehod(); i++ {
m := varType.Method(i)
m.Name, m.Type
}
// 获取结构体注解
type test struct {
Name string `tag1:"name" tag2:"tag2"`
}
for i:=0; i<varType.NumField(); i++ {
t1 := varType.Field(i).Tag.Get("tag1")
}
import encoding/json
type Test struct {
T1 string `json:"name"`
T2 int `json:"age"`
}
t := Test("Jack", 20)
jsonStr, err := json.Marshal(t)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%s", jsonStr)
// 解码
t2 := Test{}
err = json.Unmarshal(jsonStr, &t2)go 协程
go func(){}() // 开启一个 go
runtime.Goexit() // 退出 go
c := make(chan int 5) // 创建 channel
close(c) // 关闭管道
data, status := <-c // 读取 channel
data := range c // 迭代 channel暂无