[go基础语法 | 青训营笔记]

64 阅读5分钟

这是我参与「第五届青训营 」笔记创作活动的第1天~

1 什么是go语言

  1. 高性能,高并发
  2. 语法简单
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

2 基础语法

2.1 输出hello world

package main//main包的一部分,程序的入口包,程序入口文件
import (
	"fmt"//输入输出包
)
func main(){
	fmt.Println("hello world");
}

go run example/01-hello/main.go
//会输出hello world
go build example/01-hello/mian.go
./main
//会输出hello world

2.2 变量类型

package main
import (
	"fmt"
	"math"
)
func main(){
	var a = "initial"
	var b,c int = 1,2
	var d=true
    var e float64   
    f :=float32(e) //:=(值) 可以声明一个变量
    g :=a+"foo"   //字符串可以直接拼接
    fmt.Println(a,b,c,d,e,f)
    fmt.Println(g)

    const s string="constant" //const没有变量类型,可以根据上下文来确定变量的类型
  }

2.3 if-else

package main
import "fmt"
func main(){
	if 7%2 == 0{
		fmt.Println("7 is even")
	}else{
		fmt.Println("7 is odd")
	}
	
	if 8%4 == 0{
		fmt.Println("8 is divisible by 4")
	}
	
	if num :=9;num<0{//这里有点不是很懂
		fmt.Println(num,"is negative")
	}else if num < 10{
		fmt.Println(num,"has 1 digit")
	}else{
		fmt.Println(num,"has mutiple digits")
	}
		
}

2.4 基础语法-循环

package main
import "fmt"
func main(){
	i := 1
	for{
		fmt.Println("loop")
		break
	}
	for j:= 7; j<9; j++ {
		fmt.Println(j)
	}
	for n := 0; n <5; n++{
		if n%2 ==0{
			continue
		}
		fmt.Println(n)	
	}
	for i <= 3 {
		fmt.Println(i)
		i=i+1
	}
}

2.5 swtich

package main
import (
	"fmt"
	"time"
)
func main(){
	a := 2
	switch a{
		case 1:
			fmt.Println("one")
		case 2:
			fmt.Println("two")
		...
		default:
			fmt.Println("other")
	}
	
	t := time.Now()
	switch{
	case t.Hour() < 12:
		fmt.Println("It...")
	default:
		fmt.Println("...")
	}
}

2.6 数组

package main
import "fmt"
func main(){
	var a [5]int
	a[4] = 100//写入第四个位置的值
	fmt.Println(a[4],len(a))  //真实很少用数组,因为长度固定,一般都用切片
	
	b := [5]int{1,2,3,4,5}
	fmt.Println(b)
	
	var twoD [2][3]int
	for i :=0; i<2; i++{
		for j :=0; j<3;j++{
			twoD[i][j] =i+j
		}
	}
	fmt.Println("2d",twoD)
}

2.7切片

package main

import "fmt"

func main(){
    s := make([]string,3) //用Make创作切片
    s[0]='a'
    s[1]='b'
    s[2]='c'
    fmt.Println("get:",s[2])//c
    fmt.Println("len:",len(s))//3
    
    s = append(s,"d") //赋值回去?
    s = append(s,"e","f")
    fmt.Println(s)
    
    c :=make([]string,len(s))
    copy(c,s)
    fmt.Println(c)
    
    fmt.Println(s[2:5]) //[c d e]
    fmt.Println(s[:5]) //[a b c d e]
    fmt.Println(s[2:]) //[c d e f]
    
    good := []string{"g","o","o","d"}
    fmt.Println(good) // [g o o d]
}

2.8 基础语法-map

package main

import "fmt"

func main(){
	m :=make(map[string]int)
	m["one"] = 1
	m["two"] = 2
	fmt.Println(m)    //map[one:1 two:2]
	fmt.Println(len(m))  //2
	fmt.Println(m["one"]) //1
	fmt.Println(m["unknow"]) //0
	
	r, ok :=m["unknow"]
	fmt.Println(r,ok) //0 false
	
	delete(m,"one")
	
    m2 :=map[string]int{"one": 1,"two":2}
	var m3=map[string]int{"one": 1,"two": 2}
	fmt.Println(m2,m3)

}

2.9 range

package main
import "fmt"

func main(){
	nums :=[]int{2,3,4}
	sum :=0
	for i,num := range nums{
		sum +=num
		if num == 2{
			fmt.Println("index:",i,"num:",num) //index: 0 num: 2
		}
	}
	fmt.Println(sum)
	
	m := map[string]string("a":"A","b":"B");
	for k,v :=range m{
		fmt.Println(k,v)
	}
	for k :=range m{
		fmt.Prinln("key",k)  //key a;key b
	}
}

2.10 函数

package main
import "fmt"

func add(a int,b int) int{
    return a+b;
}

func add2(a,b int) int{
    return a+b;
}

/*返回两个值*/
func exists(m map[string]string,k string)(v string,ok bool){
    v, ok = m[k]
    return v,ok
}

func main(){
    res :=add(1,2)
    fmt.Println(res)
    
    v,ok :=exists(map[string]string{"a":"A"},"a")
    fmt.Println(v,ok)
}

2.11指针

package main

import "fmt"

func add2(n int){
    n += 2 //实际这个参数是拷贝,没有真正改变 
}

func add2ptr(n *int){
    *n += 2
}

func main(){
    n := 5
    add2(n)
    fmt.Println(n) //5
    add2ptr(&n)
    fmt.Println(n) //7
}

2.12 结构体

package main

import "fmt"

type user strcut{
	name string
	password string
}

func main(){
	a :=user{name :"wang",password: "1024"}
	b :=user{"wang","1024"}
	c :=user{name: "wang"}
	c.password ="1024"
	var d user
	d.name="wang"
	d.password="1024"
	
    fmt.Println(a,b,c,d)  //{wang 1024}{wang 1024}{wang 1024}
	fmt.Println(checkPassword(a,"haha")) //false
	fmt.Println(checkPassword(&a,"haha")) //false
}

func checkPassword(u user,password string) bool{
	return u.password == password
}

func checkPassword(u *user,password string) bool{
	return u.password == password
}

func checkPassword(u *user ,password string) bool{
	return u.password == password
}

2.13 结构体方法

package main
import "fmt"

type user struct{
	name string
	password string
}

/*加个括号就能变成成员函数*/
func (u user) checkPassword(password string) bool{
	return u.password == password
}

func (u *user) resetPassword(password string){
    a :=user{name: "wang",password :"1024"}
    a.resetPassword("2048")
    fmt.Println(a.checkPassword("2048"))//true
}

2.14 错误处理

package main
import(
	"error"
    "fmt"
)

type user struct{
    name string
    password string
}

func findUser(user []user,name string)(v *user,err error){
    for _, U :=range users{
        if u.name == name{
            return &u,nil//返回两个值
        }
    }
    return nil,error.New("not found")
}

func main(){
    u,err :=findUser([]user{{"wang","1024"}},"wang")
    if err != nil{
        fmt.Println(err)
        return  //没有err才可以真正返回值
    }
    fmt.Println(u.name) //wang
    
    if u,err :=findUser([]user{{"wang","1024"}},"li");err != nil {
        fmt.Println(err)
        return 
    }else{
        fmt.Println(u.name)
    }
}

2.15字符串操作

package main

import(
	"fmt"
    "string"
)

func main(){
    a := "hello"
    fmt.Println(strings.Contains(a,"li")) //true
    fmt.Println(strings.Count(a,"l")) //2
    fmt.Println(strings.HasPrefix(a,"he")) //true
    fmt.Println(strings.HasSuffix(a,"llo")) //true
    fmt.Println(strings.Index(a,"ll"))   //2
    fmt.Println()
    
}

2.16 字符串格式化

package main

import "fmt"

type point struct{
    x,y int
}

func main(){
    s :="hello"
    n :=123
    p :=point{1,2}
    fmt.Println(s,n)  //hello
    fmt.Println(p)    //{1,2}
    
    fmt.Println("s=%v\n",s) //s=hello
    fmt.Println("n=%v\n",n) //n==123
    fmt.Println("p=%v\n",p) //p={1 2}//打印出值
    fmt.Println("p=%+v\n",p)//p={x:1 y:2}  //%+v会打印出字段的名字和值
    fmt.Println("p=%#v\n",p)//p=main.point{x:1,y:2} //%#v打印出整个构造类型名称和值
    
    f :=3.141592653
    fmt.Println(f)          //3.141592653
    fmt.Println("%.2f\n",f) //3.14
}

2.17 JSON操作

package main

import (
	"encoding/json"
	"fmt"
)
//保证结构体的每一个字段都是大写,那这个结构体就可以用JSON的Marshal序列化
type userInfo struct{
	Name string
	Age int 'json:"age"' //加了这个json...下面是输出的字段就变成小写了
	Hobby []string
}

func main(){
	a := userIndo{Name: "wang",Age: 18,Hobby: []string{"Golang","TypeScript"}}
	buf ,err :=json.Marshal(a)//序列化之后变成buf数组,简单理解成字符串
	if err !=nil{
		panic(err)
	}
	fmt.Println(buf)//{123 34 78 97}
	fmt.Println(string(buf)) //{"name":"wang","age":18,"Hobby":["Golang","typeScript"]}
	
	buf,err=json.MarshalIndent(a,"","\t")
	if err !=nil{
		panic(err)
	}
	
	fmt.Println(string(buf))
	
	var b userInfo
	err=json.Unmarshal(buf,&b) //反序列化
	if err !=nil{
		panic(err)
	}
	fmt.Printf("%#v\n",b)
}

2.18时间处理

package main

import (
	"fmt"
	"time"
)

func main(){
	now :=time.Now()
	fmt.Println(now) //2022-03-27 18.....
	t 
}

2.19 数字解析

略(同java差不多)

2.20 进程信息

package main
import (
	"fmt"
	"os"
	"os/exec"
)

func main(){
	//go run example/20-env/main.go a b c d
	fmt.Println(os.Args)//[/var/folders/8p/n34xxfnx38d...]
	fmt.Println(os.Getenv("PATH")) //usr/local/go/bin..
	fmt.Println(os.Setenv("AA","BB"))
	
	buf,err := exec.Command("grep","127.0.0.1","/etc/hosts").CombineOutput()
	if err != nil{
		panic(err)
	}
	fmt.Println(string(buf)) //127.0.0.1 localhost

}

总结

语法跟C++和java有点像,但是很容易混淆,应该多写写~