package main
import("fmt""math")// import "fmt"// import "math"funcmain(){
fmt.Println(math.Pi)}/*
** https://go.dev/doc/install
** wget https://dl.google.com/go/go1.20.3.linux-amd64.tar.gz
** sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.20.3.linux-amd64.tar.gz
** export PATH=$PATH:/usr/local/go/bin
*/// go mod init// go mod tidy// go run .
函数
连续2个或多个命名形参类型相同时,除最后一个类型外,其它都可省略
多值返回
命名返回值
package main
import("fmt""math")funcdouble(x int)int{return x *2}// 多个参数类型相同可以省略前面的funcadd(x, y int)int{return x + y
}// 可以多个返回值funcswap(a, b int)(int,int){return b, a
}funcswapString(a, b string)(string,string){return b, a
}// 返回值可以命名,一直return就可以funcsplit(sum int)(x, y int){
x = sum *4/9
y = sum - x
return}funcmain(){
fmt.Println(math.Pi)
fmt.Println(double(4))
fmt.Println(add(4,5))
fmt.Println(swap(6,7))
fmt.Println(swapString("hello ","world! "))
fmt.Println(split(16))}
jiazhao@DESKTOP-AMJKBOJ:~/samples/languages/go/quick_start$ go run .
3.141592653589793
8
9
7 6
world! hello
7 9
jiazhao@DESKTOP-AMJKBOJ:~/samples/languages/go/quick_start$
var变量
可以出现在 package 级别,也定义在 func 里。
可以一起初始化,也可以不指定类型。
简介赋值语句 := 可以在类型明确的地方代替 var 生命,但不能出现在 func 外。
package main
import("fmt")// func 外var a, b, c bool// 初始化var x, y int=10,20funcmain(){var i int// 自动检测类型var c, python, java ="nice",true,"yeah"// 简写方式
j :=3
mother, father :="my mother","my father"
fmt.Println(a, b, c, i)
fmt.Println(c, python, java)
fmt.Println(j)
fmt.Println(mother, father)}
jiazhao@DESKTOP-AMJKBOJ:~/samples/languages/go/quick_start$ go run .
false false nice 0
nice true yeah
3
my mother my father
jiazhao@DESKTOP-AMJKBOJ:~/samples/languages/go/quick_start$
const变量
类型
基本类型
bool
string
int, int8, int16, int32, int64
uint, uint8, uint32, uint64, uintptr
byte == uint8
rune == int32 表示一个unicode
float32, float64
complex64, complex128
类型自动推导
类型转换
不同类型转换时需要显示转换
sting -> int :
int -> string :
string -> []byte :
[]byte -> string :
float64 -> string :
package main
import("fmt""strconv")funcmain(){
i :=22// int -> float
j :=float32(i)// float -> uint
k :=uint(j)
_a :="43"// string -> int
a,_:= strconv.Atoi(_a)// int -> string
_b :=55555
b := strconv.Itoa(_b)// string -> []byte
myString :="ABCD"var myByte []byte=[]byte(myString)// []byte -> stringvar infoByte []byte=[]byte{65,66}
infoString :=string(infoByte)
fmt.Printf("%d\r\n", i)
fmt.Printf("%f\r\n", j)
fmt.Printf("%d\r\n", k)
fmt.Println(a)
fmt.Println(b)
fmt.Println(myByte)
fmt.Println(infoString)}
流程控制
只有一种循环结构 for
for i := 1; i <= 10; i++ {}
for a < b {} 和其它的while一样
for {} 死循环
for index, value := range arrOrMap {}
if else
if 可在执行判断前,先执行一个语句 if z := x + y; z < a {}
switch
每个case 之后自带 break, 除非指定 fallthrough,否则不会自动往后执行
也可以在执行前,先执行一个语句。 switch v := x + y; v {}
defer
package main
import("fmt""time")funcmain(){
sum :=0// 没有括号for i :=1; i <=10; i++{
sum += i
}
fmt.Println(sum)
j :=1// 前后都可省略for j <=5{
fmt.Println(j)
j++}// 死循环for{
fmt.Printf(". ")
time.Sleep(time.Duration(1)* time.Second)}}
jiazhao@DESKTOP-AMJKBOJ:~/samples/languages/go/quick_start$ go run .
55
1
2
3
4
5
. . . . . .
package main
import("fmt""runtime""time")funcadd(x, y int)int{
fmt.Println("------add.")return x + y
}funcmain(){// 先执行add, 在最后才执行exit.....defer fmt.Println("exit..... ",add(2,3))
fmt.Print("Go run on ")switch os := runtime.GOOS; os {case"linux":
fmt.Println("Linux.")// 自带了 breakdefault:
fmt.Printf("%s, ah\r\n", os)}
t := time.Now()switch{case t.Hour()<12:
fmt.Println("Good morning.")case t.Hour()<17:
fmt.Println("Good afternoon.")default:
fmt.Println("Good evening.")}}
jiazhao@DESKTOP-AMJKBOJ:~/samples/languages/go/quick_start$ go run .
------add.
Go run on Linux.
Good afternoon.
exit..... 5
jiazhao@DESKTOP-AMJKBOJ:~/samples/languages/go/quick_start$