golang基礎-高級特性概述

協程

協程是golang最重要的一個特性。在協程出現以前,線程被做爲調度的最小單位。協程能夠理解是一種用戶態,邏輯層面的線程。 經過協程,咱們將很容易地實現高併發。 加入你要作三件事,假設要執行a,b,c三個方法。代碼該怎麼寫?日常咱們的寫法就是java

a()
b()
c()
複製代碼

只有a作完了,才能作b,b作完了,才能作c。 但有了協程就能夠c++

go a()
go b()
go c()
複製代碼

三個同時進行,充分利用多核的性能。golang

管道

管道概念面試

  1. 相似unix中管道(pipe)
  2. 先進先出
  3. 線程安全,多個goroutine同時訪問,不須要加鎖
  4. channel是有類型的,一個整數的channel只能存放整數

管道的定義編程

var ch0 chan int
var ch1 chan string
var ch2 chan map[string]string

type stu struct{}

var ch3 chan stu
var ch4 chan *stu
複製代碼

管道用於協程之間數據的傳遞。通常分爲有緩衝管道,和無緩衝管道。兩個協程間若是有數據交流怎麼辦,這時候就能夠用管道來傳遞。 golang的設計是想就是用通訊代替共享內存。安全

func a() {
    ch <- 1
}

func b() {
    ch <- 
}
複製代碼

管道能夠帶緩衝,就是說能夠往管道里放多個數據,放滿了,纔會阻塞。bash

c1:=make(chan int) 無緩衝
c2:=make(chan int,1) 有緩衝
複製代碼

c1<-1 無緩衝: 不單單是向 c1 通道放 1,而是一直要等有別的攜程 <-c1 接手了這個參數,那麼c1<-1纔會繼續下去,要否則就一直阻塞着。併發

有緩衝: c2<-1 則不會阻塞,由於緩衝大小是1,只有當放第二個值的時候,第一個還沒被人拿走,這時候纔會阻塞。異步

面試常常會問到這個問題。 實際就是同步和異步的區別。函數

接口 interface

定義:An interface is a collection of method signatures that an Object can implement 一個接口是一組函數簽名的集合。具體結構能夠實現他們。 好比:

type Shape interface {
    Area() float64
    Perimeter() float64
}
複製代碼

這就是一個接口,聲明瞭兩個方法Area和Perimeter 下面我們能夠定義具體結構,實現這個接口。

// type rect
type Rect struct {
    height float64
    weight float64
}

func (p *Rect) Area() float64 {
    return p.height * p.weight
}

func (p *Rect) Perimeter() float64 {
    return 2 * (p.height + p.weight)
}
複製代碼

接口能夠提供面向對象編程的能力,只要實現了某接口,就能夠用該接口對象 指向具體類型對象。相同類型的引用,指向不一樣對象,即多態。 咱們看到,golang中的派生關係,不像c++,java同樣須要顯式指定,只須要實現接口所定義的全部方法便可。因此,golang的繼承關係,是非侵入式的,這也是golang的特點與優勢。

相關文章
相關標籤/搜索