go

概念

package

源码文件

命令行工具

语法

// single row/*multi row*/
package main // 程序所属包import "fmt" // 导入依赖包const NAME = "cxk" // 常量定义type myInt int // 一般类型声明// 结构体声明type user struct { }// 接口声明type UserService interface { }// 入口函数func main(){  var a = "cxk"  fmt.Println(a+NAME)}

import

// 另外一种语法import (   "fmt"  "time")

原理

批注 2020-04-14 155821

别名

import pk "awesomeProject/pkg1"pk.F()
import . "awesomeProject/pkg1"F()
import _ "awesomeProject/pkg1"

数据类型

var i uint32 = 2fmt.Println(unsafe.Sizeof(i)) // 4var i1 int = 2fmt.Println(unsafe.Sizeof(i1)) // 8var i2 float32 = 1.0fmt.Println(unsafe.Sizeof(i2)) // 4var i3 bool = truefmt.Println(unsafe.Sizeof(i3)) // 1var i4 byte = 1fmt.Println(unsafe.Sizeof(i4)) // 1

批注 2020-04-14 190812

变量

var(i intj float32name string)
var a, b, c int = 1,2,3// 或者var a,b,c = 1,2,3// 省略vara,b,c := 1,2,3
var a=1func main(){	b:=2	fmt.Println(a,b)}
var _ = 2// 无法使用_
var a =1var b  = float32(a)
// pkg1func F1(){}func f1(){}// mainfunc main(){	pkg1.F1()	//pkg1.f1() 无法访问}

常量

显式: const identifier [type] = value隐式: const identifier = value ( 通常叫无类型常量)

const name = "cxk"const age int = 18const (	habbit1 = "sing"	habbit2 = "rap")

常量可以使用内置表达式定义,例如: len(),unsafe.Sizeof()等 ;常量范围目前只支持布尔型、数字型(整数型、浮点型和复数)和字符串型;

特殊常量iota

const a = iotaconst b = iotaconst (	c = iota	d = iota)func main(){	fmt.Println(a,b) // 0 0	fmt.Println(c,d) // 0 1}

1)跳值使用法;

const (	c = iota	_ = iota	d = iota)func main(){	fmt.Println(c,d) // 0 2}

2)插队使用法;

const (	c = iota	d = 3	e = iota)func main(){	fmt.Println(c,d,e) // 0 3 2}

3 )表达式隐式使用法;

const (	c = iota *2	d // 没有指定值,默认会继承之前的表达式	e)func main(){	fmt.Println(c,d,e) // 0 2 4}

4)单行使用法;

const (	a ,b = iota,iota+3	c,d)func main(){	fmt.Println(a,b,c,d) // 0 3 1 4}

运算符

a := 1b := 2a++ // ++运算符只能这样用println(a)b-- // --运算符只能这样用println(b)

控制语句

a := 0if a>=1 {	println("true")}else if a <= 0 {	println("false")}
a := 10switch a {case 1:	{		println("1")	}case 2:	{		println("2")	}default:	{		println("default")	}}
// 死循环for {	println("run")	time.Sleep(1*time.Second)}// 经典for循环for i:=1;i<10;i++ {	println("run",i)}// foreacha := []string{"cxk", "jntm"}for key, value := range a {	println(key, value)}
if true {	goto label2}else {	goto label1}label1:	println("label1")label2:	println("label2")
a := []string{"cxk", "jntm"}for key, value := range a {	println(key, value)	if key == 0 {		break	}}

内建方法

make

// slice类似于数组slice := make([]string,3)slice[0] = "cxk"slice[1] = "cxk2"slice[2] = "cxk3"for k,v := range slice {	println(k,v)}println("---")// mapaMap := make(map[string]string,3)aMap["a"]="1"aMap["b"]="2"for k,v := range aMap {	println(k,v)}println("---")// channel 类似缓冲区aChan := make(chan int,3)close(aChan)

new

// 返回一个指针aMap := new(map[string]string)fmt.Println(reflect.TypeOf(aMap)) // *map[string]string

append & copy & delete

slice :=make ([]string,2)slice[0]="1"slice[1]="2"slice = append(slice,"3")fmt.Println(slice) // 1 2 3
slice1 :=make ([]string,2)slice1[0]="1"slice1[1]="2"slice2 :=make([]string,2)copy(slice2,slice1)fmt.Println(slice2) // 1 2
aMap := make(map[string]string)aMap["1"]="a"aMap["2"]="b"delete(aMap,"1")fmt.Println(aMap) // 2:b

异常

func main() {	defer func() {		// 异常处理		msg := recover()		fmt.Println("msg:",msg)	}()	// 抛出异常	panic("异常")}

len && cap && close

slice := make([]int,3,5)println(len(slice)) // 3println(cap(slice)) // 5aChan := make(chan int,1)aChan <- 1close(aChan)

结构体

// 定义结构体type Person struct {	Name string	Age int}func main(){	var p Person // 声明结构体变量	p.Age = 18 // 结构体成员赋值	p1 := Person{Name: "cxk"} // 另外一种方式	p2 := new(Person) // 返回一个Person指针	p.Name = "cxk"	fmt.Println(p)}

属性及函数

// 定义Person的一个公开成员方法func (p *Person)Say(){	fmt.Println("person say")}

组合

type Animal struct {	Type string}type Dog struct {	Animal // 组合animal,Dog继承Animal的属性	Name string}

并发

func main(){	go run()	go run()	time.Sleep(time.Second*5)}func run(){	for i:=1;i<10;i++ {		time.Sleep(time.Millisecond*2)		print(i)	}	println()}
var chanInt = make(chan int,10)func main(){	go send()	go receive()	time.Sleep(5*time.Second)}func send(){	chanInt <- 1	chanInt <- 2	chanInt <- 3}func receive(){	num := <- chanInt	fmt.Println(num)	num = <- chanInt	fmt.Println(num)	num = <- chanInt	fmt.Println(num)}
var chanInt = make(chan int,10)var chan1 = make(chan int,10)func send(){	for i:=0;i<10;i++ {		chanInt <- i		chan1 <- i*i	}}func receive(){	for {		select {		case num := <- chanInt:			fmt.Println(num)		case num := <- chan1:			fmt.Println(num)		}	}}

select可以随机在多个channel中取数据

func main(){	makeFood(10)	go eatFood(10)	waitGroup.Wait()}var waitGroup sync.WaitGroupfunc makeFood(i int){	for j:=0;j<i;j++ {		waitGroup.Add(1)		fmt.Println("make food",j)	}}func eatFood(i int){	for j:=0;j<i;j++ {		fmt.Println("eat food",j)		waitGroup.Done() // countdown	}}

指针

i:=20var pi *int=&i // pi指向ifmt.Println(*pi) // 读取pi所指向的内容fmt.Println(pi == nil) // 判断是否为空a,b :=1,2pa := [...]*int{&a,&b} // 指针数组(元素为指针的数组)fmt.Println(pa)arr := [...]int{1,2,3}ap := &arr // 数组指针(指向一个数组的指针)fmt.Println(ap)

json

setting := Setting{Menu:"menu",Count: 15}byte,err:=json.Marshal(setting)if err!=nil {	fmt.Println(err)}else {	fmt.Println(string(byte))}
type Setting struct {	Menu string `json:"menu"` // 指定序列后的字段名字	Count int}
str := "{\"menu\":\"menu\",\"Count\":15}\n"var setting Settingerr := json.Unmarshal([]byte(str),&setting)if err != nil {	fmt.Println(err)}else {	fmt.Println(setting)}

module

go mod init
go mod graph