Go 简介
优势
-
高性能、高并发
-
语法简单、学习路线平缓
-
丰富标准库
-
完善的工具链
-
静态链接
-
快速编译
-
跨平台
-
垃圾回收
采用原因
-
Python 的虚拟问题
-
C++ 的不适合
-
早期非 Java 的需要
-
Go 性能好、部署简单、学习成本低、RPC 及 HTTP 框架推广
开发环境
安装 Golang
配置集成开发环境 IDE
基本命令
go run <file>
go build <file>
基础语法
hello world
func main() {
fmt.Println("Hello, World!")
}
变量
可以使用 var 或者 := 符号声明变量
可以使用 const 声明常量
Go 中存在默认变量类型推断,赋予初始值的变量可以不声明其类型
var (
num int
str string
)
func main() {
println(str, num)
var b bool
println(b)
const n = 3
println(n)
var c = 'c'
println(c)
var s = "ssss"
println(s)
bb, nn, cc, ss := b, n, c, s
println(bb, nn, cc, ss)
var n1 int64 = 10
var n2 = float64(n1)
var n3 = 10e6
println(n1, n2, n3)
println(strconv.Atoi("1"))
println(strconv.Itoa(1))
println(strconv.ParseFloat("3.14", 64))
println(strconv.FormatFloat(3.1415926, 'f', 2, 64))
var i interface{} = "Hello, World"
str, ok := i.(string)
println(str, ok)
}
if-else
可以省略条件的括号
func main() {
if 7 % 2 == 0 {
println("7 is even")
} else {
println("7 is odd")
}
if num:= 9; num < 0 {
println(num, "is negative")
} else if num < 10 {
println(num, "has 1 digit")
} else {
println(num, " has multiple digits")
}
}
循环
可以省略条件的括号
func main() {
for i := 0; i < 10; i++ {
println(i)
}
i := 0
for i < 10 {
println(i)
i++
}
for {
println("loop")
break
}
for n := 0; n < 5; n++ {
if n % 2 == 1 {
continue
}
println(n)
}
}
switch
Go 中的 switch 分支表达式支持任意表达式而非仅仅是常量
func main() {
a := 2
switch a {
case 1:
println("one")
case 2, 3:
println("two or three")
default:
println("unknown")
}
switch {
case a < 0:
println("negative")
case a == 0:
println("positive")
case a > 0:
println("positive")
default:
println("unknown")
}
}
数组
func printArray(arr [5]int) {
for i := 0; i < len(arr); i++ {
fmt.Printf("arr[%d] = %d\n", i, arr[i])
}
}
func main() {
var arr = [5]int{1, 2, 3, 4, 5}
fmt.Println(arr)
println(arr[0], arr[1])
arr[0] = 9
println(arr)
var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(a)
println(a[0], a[1])
var aa = [5]int{0: 2, 4: 5}
fmt.Println(aa)
println(aa[0], aa[1])
var aaa = [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
fmt.Println(aaa)
println(aaa[0][0], aaa[1][1], aaa[2][2])
printArray(arr)
}
切片
func main() {
s0 := make([]int, 10, 100)
s1 := []int{1, 2, 3, 4, 5}
fmt.Println(s0)
fmt.Println(s1)
s2 := s1[2:3]
s3 := s1[3:]
s4 := s1[:3]
fmt.Println(s2)
fmt.Println(s3)
fmt.Println(s4)
println(len(s0))
println(cap(s0))
s5 := append(s1, 10)
fmt.Println(s5)
copy(s0, s1)
fmt.Println(s0)
}
map
func main() {
m := map[string]int{
"a": 1,
"b": 2,
}
fmt.Println(m)
mm := make(map[int]int, 10)
fmt.Println(mm)
println(m["a"])
println(m["c"])
m["b"] = 9
fmt.Println(m)
println(len(m))
for k, v := range m {
fmt.Printf("key=%s, value=%d\n", k, v)
}
delete(m, "a")
fmt.Println(m)
}
range
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
var alpha = map[string]string {
"a": "A",
"b": "B",
}
func main() {
for k, v := range pow {
fmt.Printf("2^%d = %d\n", k, v)
}
for k, v := range alpha {
fmt.Printf("%s : %s", k, v)
}
}
函数
func max(n1, n2 int) int {
var res int
if n1 > n2 {
res = n1
} else {
res = n2
}
return res
}
func swap(a, b string) (string, string) {
return b, a
}
func Swap(a *int, b *int) {
t := *a
*a = *b
*b = t
}
func create() func() int {
i := 0
next := func() int {
i += 1
return i
}
return next
}
func factorial(n uint64) uint64 {
if n > 0 {
return n * factorial(n-1)
} else {
return 1
}
}
func fibonacci(n int) int {
if n < 2 {
return n
} else {
return fibonacci(n-1) + fibonacci(n-2)
}
}
func main() {
println(max(3, 4))
println(max(5, 4))
println(swap("1", "2"))
a, b := 12, 23
Swap(&a, &b)
println(a, b)
next := create()
println(next())
println(next())
println(next())
println(next())
println(next())
println(factorial(10))
println(fibonacci(10))
}
指针
func main() {
var ptr *int
println(ptr)
var n = 10
ptr = &n
println(ptr)
println(*ptr)
ptr = nil
println(ptr)
var arr = [3]int{1, 2, 3}
var p [3]*int
for i := 0; i < 3; i++ {
p[i] = &arr[i]
fmt.Printf("arr[%d] = %d\n", i, *p[i])
}
var pp **int
println(pp)
ptr = &n
pp = &ptr
println(pp)
println(*pp)
println(**pp)
}
结构体
代表具有一组变量集合的数据结构
type book struct {
id int
title string
}
func (b book) toString() string {
return fmt.Sprintf("id=%d title=\"%s\"", b.id, b.title)
}
func (b *book) toPrimate() error {
return errors.New(fmt.Sprintf("[ERROR]: %d %s", b.id, b.title))
}
func main() {
b0 := book{0, "test 0"}
b1 := book{
id: 1,
title: "test 1",
}
b2 := book{
title: "test 2",
}
fmt.Println(b0)
fmt.Println(b1)
fmt.Println(b2)
fmt.Println(b0.title)
fmt.Println(b1.title)
fmt.Println(b2.title)
fmt.Println(b0.toString())
fmt.Println(b1.toString())
fmt.Println(b2.toString())
fmt.Println(b0.toPrimate())
fmt.Println(b1.toPrimate())
fmt.Println(b2.toPrimate())
fmt.Println(getId(b0))
fmt.Println(getTitle(&b0))
fmt.Println(getId(b1))
fmt.Println(getTitle(&b1))
fmt.Println(getId(b2))
fmt.Println(getTitle(&b2))
p0 := &b0
fmt.Println(&p0)
fmt.Println(p0.title)
fmt.Println(p0.toString())
}
func getId(book book) int {
return book.id
}
func getTitle(book *book) string {
return book.title
}
接口
代表具有一组方法集合的数据结构
type Base interface {
getId() int
}
type Book struct {
id int
}
func (b Book) getId() int {
return b.id
}
func main() {
var book Base = new(Book)
println(book.getId())
var b = book.(*Book)
b.id = 10
println(book.getId())
}
错误处理
func sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("invalid param")
} else {
return math.Sqrt(f), nil
}
}
func main() {
result, error := sqrt(-1)
println(result, error)
if (error != nil) {
println("SUCCESS")
} else {
println("ERROR")
}
res, err := sqrt(1)
println(res, err)
if (err != nil) {
println("SUCCESS")
} else {
println("ERROR")
}
}
字符串操作
func main() {
s := "hello"
fmt.Println(strings.Contains(s, "l"))
fmt.Println(strings.Count(s, "l"))
fmt.Println(strings.HasPrefix(s, "h"))
fmt.Println(strings.HasSuffix(s, "o"))
fmt.Println(strings.Index(s, "l"))
fmt.Println(strings.Join([]string{"h", "e", "l", "l", "o"}, "-"))
fmt.Println(strings.Repeat(s, 2))
fmt.Println(strings.Replace(s, "h", "H", -1))
fmt.Println(strings.Split("a-b-c", "-"))
fmt.Println(strings.ToLower(s))
fmt.Println(strings.ToUpper(s))
fmt.Println(len(s))
}
字符串格式化
type Point struct {
x, y int
}
func main() {
fmt.Printf("code = %d %% %x %% %o %% %b & date = %s & value = %f \n", 123, 123, 123, 123, "2023-12-31", 12.3456789)
str := fmt.Sprintf("code = %d %% %x %% %o %% %b & date = %s & value = %f \n", 123, 123, 123, 123, "2023-12-31", 12.3456789)
fmt.Print(str)
point := Point{1, 2}
fmt.Printf("point=%v\n", point)
fmt.Printf("point=%+v\n", point)
fmt.Printf("point=%#v\n", point)
}
JSON处理
type User struct {
Name string
Age int
Languages []string `json:"languages"`
}
func main() {
u := User{Name: "x", Age: 6, Languages: []string{"JavaScript", "TypeSScript"}}
buf, err := json.Marshal(u)
if err != nil {
panic(err)
}
fmt.Println(buf)
fmt.Println(string(buf))
var b User
err = json.Unmarshal(buf, &b)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", b)
}
时间处理
func main() {
now := time.Now()
fmt.Println(now)
fmt.Println(now.Unix())
t := time.Date(2022, 4, 5, 23, 23, 45, 0, time.UTC)
fmt.Println(t)
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
fmt.Println(t.Format("2012-05-06 12:45:23"))
tt, err := time.Parse("2012-05-06 12:45:23", "2012-05-16 12:45:23")
if err != nil {
panic(err)
}
fmt.Println(tt == t)
diff := tt.Sub(t)
fmt.Println(diff)
fmt.Println(diff.Hours(), diff.Minutes(), diff.Seconds())
}