Go语言轻松入门

Go语言轻松入门

1. Go环境配置

1.1 环境安装

主要有以下途径供选择(会使用魔法的可以直接使用第一种方法

  1. https://go.dev/dl/
  2. https://studygolang.com/dl

校验

打开CMD,输入go version,如若返回版本信息则为安装成功。

1.2 IDE

  1. 推荐Goland,安装简单,使用体验舒适。
  2. VsCode也有Go插件,但是配置好像挺麻烦的。
  3. 1024Code字节推荐的在线编译器,免去一切环境配置的烦恼。

2. Go基础语法

2.1 第一个Go程序

// main作为执行的入口 所以这里应该写main 而main函数必须要在main包下面
package main  
  
import "fmt"  
  
func main() {  
fmt.Println("hello world")  
}

在终端输入 go run main.c 即可得到程序执行结果。

当然也可以使用go build main.go得到二进制文件,然后./main执行。

2.2 变量定义及初始化

  1. 普通变量
// var 
// 变量名后面可用类型关键字
// 也可以省略,与Python类似会自动确定变量类型
var a = "hello"
var b int = 1
var c = true
var d float 64

// :=
e := float32(e)
f := a + "foo"
  1. 常量
    var改成const即可,变量名可省略
const N int = 100010

2.3 条件控制语句

if-else

需要写{} 不需要写()

使用GoLand就算你不小心写了(),自动格式化的时候也会帮你去掉.

switch

    a := 2
    switch a {
    case 1:
        fmt.Println("one")
    case 2:
        fmt.Println("two")
    case 3:
        fmt.Println("three")
    case 4, 5:
        fmt.Println("four or five")
    default:
        fmt.Println("other")
    }
​
    t := time.Now()
    fmt.Println("the time now is " + strconv.Itoa(t.Hour()) + "h") /* print the time's hour now */
    switch {
    case t.Hour() < 12:
        fmt.Println("It's before noon")
    default:
        fmt.Println("It's after noon")
    }

2.4 for

go有且只有for

    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 { // 类似while
        fmt.Println(i)
        i++
    }

2.5 数组

const N int = 10
// tr := [N]int{}
var tr [N]int // 初始化为0
size := len(tr)

// tr := [N][N]int{}
var tr [N][N]int

2.6 变长数组与切片

var tr []int
tr = append(tr, 1)
fmt.Println(tr)

执行结果为 1

tr := make([]int, 3)
tr = append(tr, 1)
fmt.Println(tr)

执行结果为 0 0 0 1

tr[l:r] // 左闭右开

2.7 map

// mp := make(map[string]int){"a" : 1, "b" : 2}
mp := make(map[string]int)
mp["a"] = 1
r, ok := m["a"] // 存在ok=true 不存在ok=false r为空
delete(mp, "a")

2.8 range

给容器创建迭代器,遍历容器中的元素


        nums := []int{2, 3, 4}
        sum := 0
        for i, num := range nums {
            sum += num
            if num == 2 {
                fmt.Println("index:", i, "num:", num)
            }
        }
        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.Println("key", k)
        }

2.9 函数 func

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

2.10 指针

修改传参

func add(x *int) {
	*x += 2
}
n := 1
new_add(&n)

2.11 struct

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

2.12 error

函数返回中包括正常返回的结果和错误两种类型


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

2.13 string


func main() {
    a := "hello"
    fmt.Println(strings.Contains(a, "ll"))                // 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(strings.Join([]string{"he", "llo"}, "-")) // he-llo
    fmt.Println(strings.Repeat(a, 2))                     // hellohello
    fmt.Println(strings.Replace(a, "e", "E", -1))         // hEllo, -1表示替换的数量没有限制
    fmt.Println(strings.Split("a-b-c", "-"))              // [a b c]
    fmt.Println(a)
    fmt.Println(strings.ToLower(a)) // hello
    fmt.Println(strings.ToUpper(a)) // HELLO
    fmt.Println(len(a))             // 5
    b := "你好"
    fmt.Println(len(b)) // 6 一个中文字相当于3个英文字符
}

2.14 json

保证每一个字段的第一个字母是大写!

a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a) // 序列化
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.15 time

now := time.Now()
t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
fmt.Println(t)// 2022-03-27 01:25:36 +0000 UTC
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25
fmt.Println(t.Format("2006-01-02 15:04:05")) // 2022-03-27 01:25:36 格式化t

diff := t2.Sub(t) // 时间差
fmt.Println(diff) // 1h5m0s
fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900

// 将给定时间格式化成time类型
t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
if err != nil {
    panic(err)
}
fmt.Println(t3 == t)    // true
fmt.Println(now.Unix()) // 1648738080 时间戳

2.16 strconv

数字解析,以及转换


f, _ := strconv.ParseFloat("1.234", 64)
fmt.Println(f) // 1.234
​
n, _ := strconv.ParseInt("111", 10, 64)
fmt.Println(n) // 111
​
n, _ = strconv.ParseInt("0x1000", 0, 64)
fmt.Println(n) // 4096
​
n2, _ := strconv.Atoi("123")
fmt.Println(n2) // 123
​
n2, err := strconv.Atoi("AAA")
fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax

2.17 进程信息,获取系统参数


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

2.18 标准输入输出

package main

import "fmt"

func main() {
	var name string
	var age int
	//空格 or 回车分割
	fmt.Scan(&name, &age)
	//空格分割 回车结束
	fmt.Scanln(&name, &age)
	//
	fmt.Scanf("%s%d", &name, &age)

    fmt.Println()
	fmt.Printf()
	fmt.Print()
}

常用资料

  1. https://go.dev/doc/
posted @ 2023-10-13 16:52  Jannan  阅读(981)  评论(0)    收藏  举报