goweb-go語言基礎

go語言基礎

雖然這本書是講goweb,但仍是吧go語言基礎過了一遍,因爲我以前已經對go語言基礎作了一遍系統的學習,這裏就當簡單回顧一下,再也不寫過多筆記了,以前的寫的博客都有基礎知識,O(∩_∩)O哈哈~git

Go是天生支持UTF-8的,任何字符均可以直接輸出,你甚至能夠用UTF-8中的任何字符做爲標識符。github

Go使用package(和Python的模塊相似)來組織代碼。main.main()函數(這個函數位於主包)是每個獨立的可運行程序的入口點。Go使用UTF-8字符串和標識符(由於UTF-8的發明者也就是Go的發明者之一),因此它天生支持多語言golang

Comma-ok斷言

Go語言裏面有一個語法,能夠直接判斷是不是該類型的變量: value, ok = element.(T),這裏value就是變量的值,ok是一個bool類型,element是interface變量,T是斷言的類型。web

若是element裏面確實存儲了T類型的數值,那麼ok返回true,不然返回false。編程

package main

    import (
        "fmt"
        "strconv"
    )

    type Element interface{}
    type List [] Element

    type Person struct {
        name string
        age int
    }

    //定義了String方法,實現了fmt.Stringer
    func (p Person) String() string {
        return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)"
    }

    func main() {
        list := make(List, 3)
        list[0] = 1 // an int
        list[1] = "Hello" // a string
        list[2] = Person{"Dennis", 70}

        for index, element := range list {
            if value, ok := element.(int); ok {
                fmt.Printf("list[%d] is an int and its value is %d\n", index, value)
            } else if value, ok := element.(string); ok {
                fmt.Printf("list[%d] is a string and its value is %s\n", index, value)
            } else if value, ok := element.(Person); ok {
                fmt.Printf("list[%d] is a Person and its value is %s\n", index, value)
            } else {
                fmt.Printf("list[%d] is of a different type\n", index)
            }
        }
    }

反射

Go語言實現了反射,所謂反射就是能檢查程序在運行時的狀態。咱們通常用到的包是reflect包。如何運用reflect包,官方的這篇文章詳細的講解了reflect包的實現原理,laws of reflection併發

使用reflect通常分紅三步,下面簡要的講解一下:要去反射是一個類型的值(這些值都實現了空interface),首先須要把它轉化成reflect對象(reflect.Type或者reflect.Value,根據不一樣的狀況調用不一樣的函數)。這兩種獲取方式以下:app

t := reflect.TypeOf(i)    //獲得類型的元數據,經過t咱們能獲取類型定義裏面的全部元素
v := reflect.ValueOf(i)   //獲得實際的值,經過v咱們獲取存儲在裏面的值,還能夠去改變值

轉化爲reflect對象以後咱們就能夠進行一些操做了,也就是將reflect對象轉化成相應的值,例如函數

tag := t.Elem().Field(0).Tag  //獲取定義在struct裏面的標籤
name := v.Elem().Field(0).String()  //獲取存儲在第一個字段裏面的值

獲取反射值能返回相應的類型和數值學習

var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())

最後,反射的話,那麼反射的字段必須是可修改的,咱們前面學習過傳值和傳引用,這個裏面也是同樣的道理。反射的字段必須是可讀寫的意思是,若是下面這樣寫,那麼會發生錯誤ui

var x float64 = 3.4
v := reflect.ValueOf(x)
v.SetFloat(7.1)

若是要修改相應的值,必須這樣寫

var x float64 = 3.4
p := reflect.ValueOf(&x)
v := p.Elem()
v.SetFloat(7.1)

上面只是對反射的簡單介紹,更深刻的理解還須要本身在編程中不斷的實踐。

var和const參考2.2Go語言基礎裏面的變量和常量申明
package和import已經有太短暫的接觸
func 用於定義函數和方法
return 用於從函數返回
defer 用於相似析構函數
go 用於併發
select 用於選擇不一樣類型的通信
interface 用於定義接口,參考2.6小節
struct 用於定義抽象數據類型,參考2.5小節
break、case、continue、for、fallthrough、else、if、switch、goto、default這些參考2.3流程介紹裏面
chan用於channel通信
type用於聲明自定義類型
map用於聲明map類型數據
range用於讀取slice、map、channel數據
上面這二十五個關鍵字記住了,那麼Go你也已經差很少學會了。

整體來講這章寫的挺不錯的,註釋最後涉及到線程和協程時有點懵逼,對這方面接觸仍是少的緣由。

地址

相關文章
相關標籤/搜索