golang一些知识点

2.冒泡排序(二维数组使用):

func main() {
	i := 1
MYLABEL:
	for {
		i++
		if i > 3 {
			break MYLABEL
		}
	}

	fmt.Println("MYLABEL")
}

// Label名称随意,必需写在for循环前面

  

2.冒泡排序(数组使用):

 

func main() {
	var arr [6]int = [6]int{1, 9, 8, 500, 45, 2}
	arrSize := len(arr)
	for i := 0; i < arrSize; i++ {
		//fmt.Println(arr)
		for j := i; j < arrSize; j++ {
			if arr[i] < arr[j] {
				tmp := arr[i]
				arr[i] = arr[j]
				arr[j] = tmp
			}
		}
	}

	fmt.Println(arr)
}

  

3.slice扩容引起的问题:
切片的数据结构:

slice在扩容会生成一个新的slice,再将原来的slice拷贝到新的slice,然后append.这将导致元素的地址发生变化.
示例:

func main() {
	slice := make([]int, 2, 5)
	slice[0] = 10
	slice[1] = 20
	fmt.Printf("%p\n", slice)
	slice = append(slice, 1, 2, 5, 6)
	fmt.Printf("%p", slice)
}

因为有扩容,两次打印的slice数组的地址不一致.

slice作为函数参数时,传递了一个引用,我们append一个元素后,期望得到增加元素的slice,但事实上并没有:

func main() {
	slice := make([]int, 0)
	changeSlice(slice)
	fmt.Println(slice)
}

func changeSlice(slice []int) {
	slice = append(slice, 10)
}

// 输出: [],并没有增加元素这是因为切片扩容,导致了数组地址发生了变化.

所以应该将以上代码改为让其返回slice,并赋值:

func main() {
	slice := make([]int, 0)
	slice = changeSlice(slice)
	fmt.Println(slice)
}

func changeSlice(slice []int) []int {
	slice = append(slice, 10)
	return slice
}

  

4.switch type的一个例子:

type Phone interface {
	Call()
}

type Android struct {
	name string
}

func (android *Android) Call() {
	fmt.Println(android.name)
}

func main() {
	android := &Android{name: "LG"}
	HangUp(android)
}

func HangUp(all Phone) {
	switch v := all.(type) {
	case *Android:
		fmt.Println("HangUp", v.name)
	default:
		fmt.Println("unknow device")
	}
}

  

使用断言:

func HangUp(all Phone) {
	if a, ok := all.(*Android); ok {
		fmt.Println(a.name)
		return
	}
	fmt.Println("unknow device")
}

  

5.fallthrough:

fallthrough强制执行后面的case代码,fallthrough不会判断下一条case的expr结果是否为true

 

func main() {
	a := 1
	switch a {
	case 1:
		fmt.Println("1")
		fallthrough
	case 2:
		fmt.Println("2")
	default:
		fmt.Println("no match")
	}
}

// 输出1 2, 第二个case并没有判断a是不是等于2

  

6.goroutine同步:sync

 

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	runtime.GOMAXPROCS(runtime.NumCPU())
	wg := sync.WaitGroup{}
	wg.Add(10)
	for i := 0; i < 10; i++ {
		go work(&wg, i)
	}
	wg.Wait()
}

func work(wg *sync.WaitGroup, index int) {
	fmt.Println(index)
	wg.Done()
}

 

 

posted @ 2017-10-15 20:55  rorshach  阅读(308)  评论(0编辑  收藏  举报