LMLPHP后院

Golang 学习笔记技术

maybe yes 发表于 2021-08-31 04:14

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")
}

json 操作需要使用注解

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
2021-10-24 07:02:21 1635030141 0.011641