這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
2.冒泡排序(二維數組使用):
func main() {i := 1MYLABEL: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] = 10slice[1] = 20fmt.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 := 1switch a {case 1:fmt.Println("1")fallthroughcase 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()}