Go简明语法

Go基础用法

Go指针

a := 5
fmt.Println(a)

var pa *int
pa = &a

fmt.Println(pa)
fmt.Println(*pa)

go常量
const message string = "go入门"

Go选择控制语句

for循环
for i := 1; i <= 5; i++ {
fmt.Println(i)
}

If/Else逻辑判断
score := 10
if score >= 30 {
fmt.Println("MVP级别")
} else if score >= 20 {
fmt.Println("球星级别")
} else if score >= 10 {
fmt.Println("首发球员")
} else {
fmt.Println("酱油球员")
}

Switch分支
switch time.Now().Weekday() {
case time.Saturday, time.Sunday:
fmt.Println("来了来了,周末来了")
default:
fmt.Println("哭吧哭吧")
}

Go数组定义

// 数组定义
var a [5]int
fmt.Println("a数组:", a)
// 元素赋值
a[4] = 100
fmt.Println("a数组:", a)
fmt.Println("a[4]:", a[4])
// 数组长度
fmt.Println("len:", len(a))
// 数组定义且赋值
b := [5]int{1, 2, 3, 4, 5}
fmt.Println("b数组:", b)
// 二维数组
var c [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
c[i][j] = i + j
}
}
fmt.Println("二维数组: ", c)

Go切片

// 创建空切片
s := make([]string, 3)
fmt.Println("切片:", s)

s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("切片内容:", s)
fmt.Println("s[2]:", s[2])
fmt.Println("切片长度:", len(s))

// 内容追加
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("数据追加后切片内容:", s)

// 创建新的切片
c := make([]string, len(s))
// 拷贝切片内容
copy(c, s)
fmt.Println("新切片内容:", c)

// 取切片下标:2,3,4. 结果[2,5) 
l := s[2:5]
fmt.Println("数据234:", l)
// 取切片下标:0,1,2,3,4
l = s[:5]
fmt.Println("数据01234:", l)
// 取切片下标:2,3,4,5
l = s[2:]
fmt.Println("数据2345:", l)

// 创建数组
t := []string{"g", "h", "i", "x", "y", "z"}
fmt.Println("数组t:", t)
// 数组切片
fmt.Println("数组t[2:4]:", t[2:4])

Go map哈希字典

// 定义一个key:value的哈希表
m := make(map[string]int)
// 赋值
m["k1"] = 7
m["k2"] = 13

fmt.Println("m:", m)
// 给变量赋值
v1 := m["k1"]
fmt.Println("v1: ", v1)
// 哈希长度
fmt.Println("len(m):", len(m))

// 删除一个哈希值
delete(m, "k2")
fmt.Println("m:", m)

// 定义+初始化
n := map[string]int{"foo": 1, "bar": 2}
fmt.Println("n:", n)

Go range的使用

// 定义一个数组
nums := []int{2, 3, 4}
sum := 0
// range 循环数组
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)

for i, num := range nums {
fmt.Println("index:", i, ", num:", num)
}

// 迭代一个字典
kvs := map[string]string{"a": "apple", "b": "banana", "c": "orange"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}

// 仅仅迭代字典的key
for k := range kvs {
fmt.Println("key:", k)
}

// 仅仅迭代字典的value
for _, v := range kvs {
fmt.Println("value:", v)
}
// 迭代循环一个字符串
for i, c := range "iloveu" {
fmt.Println(i, string(c))
}

Go函数使用

函数声明
// a+b
func plus2(a int, b int) int {
	return a + b
}

// a+b+c
func plus3(a, b, c int) int {
	return a + b + c
}

// 四则计算:计算两个值的加减乘除结果,返回多个值
func calABCD(a, b int) (int, int, int, int) {
	return a + b, a - b, a * b, a / b
}

// 可变参数函数:合计参数值
func addNums(nums ...int) int {
	fmt.Print(nums, " ")
	total := 0
	for _, num := range nums {
		total += num
	}
	return total
}
	
函数使用
//两个数相加
result := plus2(10, 20)
fmt.Println("10+20=", result)
// 三个数相加
result = plus3(10, 20, 30)
fmt.Println("10+20+30=", result)
// 两个数计算加减乘除
w, x, y, z := calABCD(200, 100)
fmt.Println("ab四则计算=", w, x, y, z)
// 可变参数函数计算合集
result = addNums(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
fmt.Println("1-10合计为=", result)

Go递归函数

// 递归函数(自调用)
func sum(num int) int {
    if num == 1 {
        return num
    }
    return sum(num-1) + num 
}

// 求和1-10
fmt.Println(sum(10))

Go Structs的使用

值传递结构体

// 声明user结构体
type user struct {
    name string
    password string
    age  int
}


// 实例化 user 结构体 user1
user1 := user{name: "koma", password: "12345678", age: 25}
fmt.Println(user1.name, user1.password, user1.age)

// 声明一个指向 user1 的指针 user1p
user1p := &user1
fmt.Println(user1p.name, user1p.password, user1p.age)

// 利用指针给 user1 赋值,会改变 user1 的内容
user1p.name = "mike"
user1p.password = "iloveu"
user1p.age = 20
fmt.Println(user1.name, user1.password, user1.age)
fmt.Println(user1p.name, user1p.password, user1p.age)

Structs结构体定义专用的方法

rect结构体, func(r *rect) area() init area为rect的方法

// 定义矩形结构体
type rect struct {
    width, height int
}
// 为 rect 结构体定义计算面积方法 area(), 参数为指针类型
func (r *rect) area() int {
	return r.width * r.height
}
// 为 rect 结构体定义计算周长的方法 perim(), 参数为值类型
func (r rect) perim() int {
	return 2 * (r.width + r.height)
}

使用结构体方法
// 定义一个矩形结构体变量
r := rect{width: 10, height: 4}
// 分别调用计算面积和周长的方法
fmt.Println("area: ", r.area())
fmt.Println("perim:", r.perim())

// 指针方式调用
rp := &r
fmt.Println("area: ", rp.area())
fmt.Println("perim:", rp.perim())

Go接口使用

// 定义一个几何图形接口
type geometry interface {
    area() float64
    perim() float64
}
// 定义一个矩形结构体
type rect struct {
    width, height float64
}
// 定义一个圆形结构体
type circle struct {
    radius float64
}
// 矩形计算面积
func (r rect) area() float64 {
    return r.width * r.height
}
// 矩形计算周长
func (r rect) perim() float64 {
    return 2 * (r.width * r.height)
}
// 圆形计算面积
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
// 圆形计算周长
func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}
// 计算函数,参数为几何图形接口类型
func measure(g geometry) {
    fmt.Println(reflect.TypeOf(g), g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}


使用
// 声明一个矩形
r := rect{width: 4, height: 5}
// 声明一个圆形
c := circle{radius: 10}
// 用measure函数计算矩形面积和周长
measure(r)
// 用measure函数计算圆形面积和周长
measure(c)

Go协程Goroutines的使用

func sayHelo(name string) {
	for i := 1; i <= 5; i++ {
		fmt.Println("Helo", name, ":", i)
	}
}

cmd := exec.Command("clear")
cmd.Stdout = os.Stdout
cmd.Run()
// 同步执行函数
sayHelo("world")
// 异步执行函数
go sayHelo("iphone")
go sayHelo("ipad")
// 匿名函数,异步执行
go func(msg string) {
fmt.Println("this is a", msg)
}("lesson")
// 等待一秒
time.Sleep(time.Second)

Go channel通道的使用

// 定义一个字符型的通道
	message := make(chan string)
	go func() {
		for i := 1; i <= 3; i++ {
			message <- (strconv.Itoa(i) + ".helo channel.")
		}
	}()
	// 接收通道发送的消息
	result_channel := ""
	result_channel = <-message
	fmt.Println(result_channel)
	result_channel = <-message
	fmt.Println(result_channel)
	result_channel = <-message
	fmt.Println(result_channel)

	message_buff := make(chan string, 3) // 如果是2的话,系统会报错,因为线程阻塞死锁

	// 发送消息
	message_buff <- "消息1"
	message_buff <- "消息2"
	message_buff <- "消息3"

	// 接收消息
	fmt.Println(<-message_buff)
	fmt.Println(<-message_buff)
	fmt.Println(<-message_buff)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!