golang go go go!

本文最后更新于:2 小时前

基础语法

变量声明

var hello string = "Hello, Golang"
hello2 := "Hello, Golang2"

import

import (
  "fmt"
  nickname "packageName" // 别名
  . "packageName" // 全部引入
)

首字母大写,可给其他包使用,小写不可以

数据类型

整型

关键字 范围
int8 -127 ~ 128
uint8(正数) 0 ~ 255
以此类推 以此类推

浮点型

关键字 备注
float32
float64 通常使用这个

字符串

双引号包裹

布尔值

true / false

other

查看数据类型

var a string = "hello, Golang"
fmt.Printf("%T", a) // 查看数据类型 输出string

类型转换

var c string = "123"
int, err := strconv.Atoi(c)
fmt.Println(int, err)

// api...还很多

流程控制

// 仅最常用
for i:= 0; i < 10; i++ {
  fmt.Println(i)
}

a := 10
for a > 1 {
  a--
  if a == 5 {
    continue
  }
  fmt.Println(a)
}

// 死循环
for {
  fmt.Println("hello")
}

数组

arr := [3]int{0, 1, 2}
arr2 := [...]int{0, 1, 2, 5, 6}

var arr3 = new([10]int)
arr3[5] = 8
fmt.Println(arr, arr2, arr3)
// [0 1 2] [0 1 2 5 6] &[0 0 0 0 0 8 0 0 0 0]
arr := [3]int{0, 1, 2}
arr2 := [...]int{0, 1, 2, 5, 6}

var arr3 = new([10]int)
arr3[5] = 8
fmt.Println(arr, arr2, arr3)

for i := 0; i < len(arr2); i++ {
	fmt.Print(arr2[i], " ")
}
fmt.Println()

zoom := [...]string{"猫咪", "狗子", "猴子", "狮子", "大熊猫"}
// forEach
for index, value := range(zoom) {
	fmt.Println(index, value)
}

// 二维数组
arrArr := [3][3]int {
	{0, 1, 2},
	{3, 4, 5},
	{6, 7, 8},
}
fmt.Println(arrArr)

map

// 三种声明方式

var m map[string]string
m = map[string]string{}
m["name"] = "qiuqian"
m["gender"] = "male"
fmt.Println(m)

m1 := map[int]bool{}
m1[1] = true
m1[2] = false
fmt.Println(m1)

m2 := make(map[int]interface{})
m2[1] = "qiuqian"
m2[2] = 20
m2[3] = []int{1, 2, 3}
fmt.Println(m2, len(m2))
delete(m2, 3)
fmt.Println(m2, len(m2))

for key, value := range m2 {
  fmt.Println(key, value)
}

for key := range m {
  fmt.Println(key, m[key])
}

func

package main

import "fmt"

func main() {

	// 延迟函数 defer关键字 最后执行
	defer emo()

	// 闭包函数 以后用到再说

	// 自执行函数
	(func() {
		fmt.Println("自执行函数, sei也别管我")
	})()

	res1, res2 := test(1, "hello")
	fmt.Println(res1, res2)

	res3, res4 := test2(1, 2)
	fmt.Println(res3, res4)

	anonymousfunc := func(date1 interface{}) {
		fmt.Println("我是匿名函数,下面是传入的值")
		fmt.Println(date1)
	}
	anonymousfunc("嗷呜")

	test3(0, "qiuqian", "aoowu", "ysml")

}

func test(date1 int, date2 string) (ret1 int, ret2 string) {
	fmt.Println(date1, date2)
	return date1 + 1, "return date"
}

func test2(date1 int, date2 int) (ret1 int, ret2 int) {
	ret1 = date1 + 1
	ret2 = date2 + 1
	// 以赋值,不用写
	return
}

// 不定项参数 以map存储
func test3(date1 int, date2 ...string) {
	fmt.Println("打印所有参数")
	fmt.Println(date1)
	for date := range date2 {
		fmt.Println(date2[date])
	}
}

func emo() {
	fmt.Println("延迟函数")
}

结构体

package main

import "fmt"

type Person struct {
	Name string
	Age int
	Gender bool
	Hobby []string
}

func main() {

	// 显示声明
	var qiuqian Person
	qiuqian.Name = "qiuqian"
	qiuqian.Age = 20
	qiuqian.Gender = true
	qiuqian.Hobby = []string{"code", "code2"}
	//fmt.Println(qiuqian)

	// 隐式声明
	//qiuqian2 := Person{
	//	Name: "qiuqian2",
	//	Age: 21,
	//	Gender: true,
	//	Hobby: []string{"hello", "golang"},
	//}
	//fmt.Println(qiuqian2)

	// 直接 new, 得到的是结构体的地址
	qiuqian3 := new(Person)
	qiuqian3.Name = "qiuqian3"
	//fmt.Println(qiuqian3)

	qiuqianFunc(qiuqian)

}

func qiuqianFunc(qiuqian Person) {
	fmt.Println(qiuqian)
}

结构体指针

package main

import "fmt"

type Person struct {
	Name string
	Age int
	Gender bool
	Hobby []string
}

func main() {
	qq := Person{
		Name:   "qiuqian",
		Age:    20,
		Gender: true,
		Hobby:  []string{"code", "travel", "sing"},
	}

	var qiuqianP *Person
	qiuqianP = &qq

	qiuqianP.Name = "qiuqian edited!"
	// . 的优先级更高,想要使用添加括号提高优先级
	(*qiuqianP).Name = "qiuqian edited again!"

	fmt.Println(qq, qiuqianP)

}

结构体方法

package main

import "fmt"

type Person struct {
	Name string
	Age int
	Gender bool
	Hobby []string
}

func (p *Person)write_code(name string)(retstr string) {
	retstr =  name + " is writing code.."
	return retstr
}


func main() {
	qq := Person{
		Name:   "qiuqian",
		Age:    20,
		Gender: true,
		Hobby:  []string{"code", "travel", "sing"},
	}

	res := qq.write_code(qq.Name)
	fmt.Println(res)

}

结构体和 JSON 有点类似,可以在 Object 里面嵌套 Object,结构体里面嵌套结构体。

接口和Interface

package main

import "fmt"

type Animal interface {
	Eat()
	Run()
}

type Cat struct {
	Name   string
	Gender bool
}
type Dog struct {
	Name string
}

func (d Dog) Run() {
	fmt.Println(d.Name, "开始跑...")
}

func (d Dog) Eat() {
	fmt.Println(d.Name, "开始吃...")
}

func (c Cat) Run() {
	fmt.Println(c.Name, "开始跑...")
}

func (c Cat) Eat() {
	fmt.Println(c.Name, "开始吃...")
}

var L Animal

func main() {
	c := Cat{
		Name: "Tom",
		Gender: true,
	}
	MyFunc(c)
	L.Run()
}

func MyFunc(a Animal) {
	L = a
}

goroutine 和 channel

以后用到再说

package main

import (
	"fmt"
	"sync"
)

func main() {

	var wg sync.WaitGroup
	wg.Add(1)

	// 和主线程无关
	go Run(&wg)
	wg.Wait()
}

func Run(wg *sync.WaitGroup) {
	fmt.Println("Run() running...")
	wg.Done()
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!