goweb-go語言基礎

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/13/12189550.html
-Advertisement-
Play Games

go語言基礎 雖然這本書是講goweb,但還是吧go語言基礎過了一遍,由於我之前已經對go語言基礎做了一遍系統的學習,這裡就當簡單回顧一下,不再寫過多筆記了,之前的寫的博客都有基礎知識,O(∩_∩)O哈哈~ Go是天生支持UTF 8的,任何字元都可以直接輸出,你甚至可以用UTF 8中的任何字元作為標 ...


go語言基礎

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

Go是天生支持UTF-8的,任何字元都可以直接輸出,你甚至可以用UTF-8中的任何字元作為標識符。

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

Comma-ok斷言

Go語言裡面有一個語法,可以直接判斷是否是該類型的變數: value, ok = element.(T),這裡value就是變數的值,ok是一個bool類型,element是interface變數,T是斷言的類型。

如果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,根據不同的情況調用不同的函數)。這兩種獲取方式如下:

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())

最後,反射的話,那麼反射的欄位必須是可修改的,我們前面學習過傳值和傳引用,這個裡面也是一樣的道理。反射的欄位必須是可讀寫的意思是,如果下麵這樣寫,那麼會發生錯誤

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你也已經差不多學會了。

總體來說這章寫的挺不錯的,註釋最後涉及到線程和協程時有點懵逼,對這方面接觸還是少的原因。

地址


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 遞歸 遞歸: 函數中調用函數自己, 此時就是遞歸, 遞歸一定要有結束的條件 var i = 0; function f1() { i++; if (i < 5) { f1(); } console.log("從前有個山,山裡有個廟,廟裡有個和尚給小和尚講故事"); } f1(); ...
  • 最近看了《Head First Design Patterns》這本書。正如其名,這本書講的是設計模式(Design Patterns),而這本書的第一章,講的是很重要的一些設計原則(Design Principles)。 Identify the aspects of your applicati ...
  • 緩存中間件 緩存架構的實現(下) 前言 緩存架構,說白了就是利用各種手段,來實現緩存,從而降低伺服器,乃至資料庫的壓力。 這裡把之前提出的緩存架構的技術分類放出來: 瀏覽器緩存 Cookie LocalStorage SessionStorage CDN緩存 負載層緩存 Nginx緩存模塊 Squi ...
  • 棧中的數據都是以棧幀(Stack Frame)的格式存在,棧幀是一個記憶體區塊,是一個數據集,是一個有關方法( Method )和運行期數據的數據集,當一個方法A被調用時就產生了一個棧幀 Fl ,並被壓入到棧中, A方法又調用了B方法,於是產生棧幀 F2 也被壓入棧,B方法又調用了C方法,於是產生棧幀... ...
  • 一、String類 1.String類是不可以變類,也就是說String對象聲明後 2.java.lang.String;是字元串類型 (1)字元串一旦創建不可再改變,“abc”字元串對象一旦創建,不可在改變成“abcd”。 (2)提升字元串的訪問效率:在程式中使用了“緩存”技術,所以在java中所 ...
  • 重新認識基本類型的變數 變數的基本邏輯——有定才有變。在人看來,固定的是名字,變化的是名字對應的值。對電腦來說,固定的是地址,變化的是它的值。 理解電腦如何使用記憶體來完成變數的功能的: 記憶體就像一堆白紙,只能通過頁碼編號進行訪問,也就是所謂的記憶體地址。 變數就是使用一個固定地址加上這個地址對應的 ...
  • [TOC] 1. 總結 無論是在初始化列表中,還是在構造函數體內,請為內置類型對象進行手工初始化,因為C++不保證初始化它們 最好使用初始化列表進行初始化,而不要在構造函數體中使用賦值;初始化列表最好列出所有的成員變數,其排列順序應該和它們在class中的聲明順序相同 為了避免"不同源文件內定義的n ...
  • Java五子棋小游戲(控制台純Ai演算法) 繼續之前的那個五子棋程式 修複了一些已知的小Bug 這裡是之前的五子棋程式 "原文鏈接" 修複了一些演算法缺陷 本次增加了AI演算法 可以人機對戰 也可以Ai對Ai看戲 本次Ai演算法屬於初級演算法 稍微用點小套路還是可以幹掉他的 以後會更新高級演算法 本次還對程式進 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...