zoukankan      html  css  js  c++  java
  • 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
    ", 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()
    }
    

     

  • 相关阅读:
    HDU3107 Godfather(树的重心)
    POJ1655 Balancing Act(树的重心)
    codeforces 691F Couple Cover(暴力预处理)
    codeforces 691E Xor-sequences(矩阵快速幂)
    codeforces 691D Swaps in Permutation(并查集)
    HDU5727 Necklace(环排+匈牙利)
    codeforces679C Bear and Square Grid(dfs优化)
    codeforces679B Bear and Tower of Cubes(思路)
    spring boot
    spring boot资料收集
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7674144.html
Copyright © 2011-2022 走看看