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
暂无