这是我参与「第五届青训营 」笔记创作活动的第1天~
1 什么是go语言
- 高性能,高并发
- 语法简单
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
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有点像,但是很容易混淆,应该多写写~