【Golang】一文學完 Golang 基本語法

Golang 下載

安裝包鏈接:https://share.weiyun.com/InsZoHHu

IDE 下載:https://www.jetbrains.com/go/

第一個 golang 程序

package mainimport "fmt"func main() {fmt.Println("hello golang")
}

每個可執行代碼都必須包含 Package、import 以及 function 這三個要素。

變量

主函數文件:

package mainimport ("awesomeProject/package1""fmt"
)// 全局變量
var gStr string
var gInt intfunc main() {// 局部變量var lStr stringvar lInt intgStr = "out"gInt = 100lStr = "in"lInt = 50fmt.Println(gStr)fmt.Println(gInt)fmt.Println(lStr)fmt.Println(lInt)// 包外函數package1.Fun()// 包外變量package1.Str = "good"fmt.Println(package1.Str)
}

package1 包的文件:

package package1import ("fmt"
)var Str stringfunc Fun() {fmt.Println("test")
}

注意:golang是以首字母大小寫來區分對包外是否可見。

所以 Fun() 函數,Str,想要在 main 文件被訪問,都首字母大寫了。

數組,切片,字典

package mainimport "fmt"func main() {//數組初始化var strAry = [10]string{"aa", "bb", "cc", "dd", "ee"}//切片初始化var sliceAry = make([]string, 0)sliceAry = strAry[1:3]//字典初始化var dic = map[string]int{"apple":      1,"watermelon": 2,}// %v 是按照默認格式輸出fmt.Printf("strAry %+v\n", strAry)fmt.Printf("sliceAry %+v\n", sliceAry)fmt.Printf("dic %+v\n", dic)
}

切片通過索引的方式指向了數組。切片是可以更改某個元素內容的,數組則不能,在開發中,主要都是使用切片來進行邏輯處理。

條件判斷語句

package mainimport "fmt"func main() {// 可以通過 := 這種方式直接初始化基礎變量localStr := "case3"if localStr == "case3" {fmt.Printf("into ture logic\n")} else {fmt.Printf("into false logic\n")}//字典初始化var dic = map[string]int{"apple":      1,"watermelon": 2,}// 用于檢查字典中某個鍵是否存在,如果存在 num 取鍵值,ok 取 true,反之 ok 取 falseif num, ok := dic["orange"]; ok {fmt.Printf("orange num %d\n", num)}if num, ok := dic["watermelon"]; ok {fmt.Printf("watermelon num %d\n", num)}switch localStr {case "case1":fmt.Println("case1")case "case2":fmt.Println("case2")case "case3":fmt.Println("case3")default:fmt.Println("default")}
}

循環

package mainimport "fmt"func main() {for i := 0; i < 5; i++ {fmt.Printf("i = %d ", i)}fmt.Println("")j := 0for {if j == 5 {break}fmt.Printf("j = %d ", j)j++}fmt.Println("")// 可以指定初始個數也var strAry = []string{"aa", "bb", "cc", "dd", "ee"}//切片初始化var sliceAry = make([]string, 0)sliceAry = strAry[1:3]for i, str := range sliceAry {fmt.Printf("slice i %d, str %s ", i, str)}fmt.Println("")//字典初始化var dic = map[string]int{"apple":      1,"watermelon": 2,}for k, v := range dic {fmt.Printf("key %s, value %d\n", k, v)}
}

range 關鍵字用于迭代切片、數組、字典等可迭代的數據結構。

協程

package mainimport ("fmt""time"
)func a() {time.Sleep(3 * time.Second)fmt.Println("it's a")
}func b() {time.Sleep(2 * time.Second)fmt.Println("it's b")
}func c() {time.Sleep(1 * time.Second)fmt.Println("it's c")
}func main() {go a()go b()go c()time.Sleep(5 * time.Second)
}

只要使用關鍵字 go 就能讓 a,b,c 三個函數并發運行。

通道(channel)

通道的要點:

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

通道的定義:

var ch0 chan int
var ch1 chan string
var ch2 chan map[string]stringtype stu struct{}var ch3 chan stu
var ch4 chan *stu

通道可以用于協程之間數據的傳遞,一般分為有緩沖通道無緩沖通道

兩個協程間如果有數據交流,這時候就可以用通道來傳遞。

package mainimport ("fmt""time"
)var ch chan intfunc a() {time.Sleep(3 * time.Second)a := 5ch <- a // 發送操作fmt.Println("out of a")
}func b() {time.Sleep(1 * time.Second)fromA := <-ch // 接收操作b := fromA + 3fmt.Println("b is ", b)
}func main() {ch = make(chan int, 1)go a()go b()time.Sleep(20 * time.Second)fmt.Println("out of main")
}
  1. make(chan int, 1) 用于創建一個新的信道,其中 chan int 表示該信道用于傳輸整數類型的值。
  2. 逗號后的 1 是指定信道的緩沖大小。緩沖大小表示信道可以同時容納的元素個數。 在這種情況下,ch 是一個緩沖大小為 1 的信道,即最多可以同時容納一個整數值。

舉個例子:

創建緩沖信道時,當發送操作(ch <- value)發生時,如果緩沖區已滿,發送操作將被阻塞,直到有接收操作(value = <-ch)從緩沖區中讀取值。類似地,當接收操作(value = <-ch)發生時,如果緩沖區為空,接收操作將被阻塞,直到有發送操作(ch <- value)將值放入緩沖區。

chSync := make(chan int)    // 無緩沖
chAsyn := make(chan int, 1) // 有緩沖

理解有緩沖和無緩沖:

同樣是向通道里塞一個數據:chSync <-1 無緩沖場景:一直要等有別的協程通過<-chSync接手了這個參數,那么chSync<-1才會繼續下去,要不然就一直阻塞著。 有緩沖場景:chAsyn<-1則不會阻塞,因為緩沖大小是1,只有當放第二個值的時候,第一個還沒被人拿走,這時候才會阻塞。 仔細理解下,實際這就是同步和異步的區別,無緩沖一定是同步等待,有緩沖只有在緩沖滿了,異步又處理不過來的時候,才會阻塞。

舉個例子:

無緩沖

package mainimport ("fmt""time"
)var ch chan intfunc a() {time.Sleep(3 * time.Second)a := 5ch <- afmt.Println("out of a")
}func b() {time.Sleep(1 * time.Second)
}func main() {ch = make(chan int) // 無緩沖管道go a()go b()time.Sleep(20 * time.Second)fmt.Println("out of main")
}

輸出:

out of main

有緩沖:

package mainimport ("fmt""time"
)var ch chan intfunc a() {time.Sleep(3 * time.Second)a := 5ch <- afmt.Println("out of a")
}func b() {time.Sleep(1 * time.Second)
}func main() {ch = make(chan int, 1) // 有緩沖管道go a()go b()time.Sleep(20 * time.Second)fmt.Println("out of main")
}

輸出:

out of a
out of main

接口

package mainimport "fmt"// Shape 是接口
type Shape interface {Area() float64Perimeter() float64
}type Rect struct {height float64weight float64
}func (p *Rect) Area() float64 {return p.height * p.weight
}func (p *Rect) Perimeter() float64 {return 2 * (p.height + p.weight)
}func main() {var s Shape = &Rect{height: 10, weight: 8}fmt.Println(s.Area())fmt.Println(s.Perimeter())
}

代碼中Shape就是一個接口,聲明了兩個方法:面積(Area)和周長(Perimeter)。 咱們定義了一個具體結構 Rect,實現這個接口。可以看到,用基礎的 Shape 接口,可以一個指向 Rect 對象,并調用其方法。

Golang 只需要實現某個 interface 的全部方法,那么就是實現了該類型。所以,Golang的繼承關系是非侵入式的,這也是Golang的特色與優點。

webserver

用 http 裸寫:

package mainimport ("log""net/http"
)func SayHello(w http.ResponseWriter, r *http.Request) {w.Write([]byte("hello")) // 以字符串"hello"作為返回包
}func main() {http.HandleFunc("/say_hello", SayHello)err := http.ListenAndServe(":8080", nil) // 開啟一個http服務if err != nil {log.Print("ListenAndServe: ", err)return}
}

運行,然后就能訪問了:http://localhost:8080/say_hello

寫在最后:

以上就是本篇文章的內容了,感謝你的閱讀。

如果感到有所收獲的話可以給博主點一個贊哦。

如果文章內容有遺漏或者錯誤的地方歡迎私信博主或者在評論區指出~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flutter 狀態管理 Provider

狀態管理必要性 Flutter基于聲明式構建UI&#xff0c;原生則是命令式&#xff0c;狀態管理是用于解決聲明式開發帶來的問題。 例&#xff1a;命令式的原生&#xff0c;數據更新需要拿到對應控件并更改其顯示值&#xff1b;而聲明式則需要更改數據值并通過setstate更新狀態&am…

sql高頻面試題-連續完成兩個指定動作的用戶統計

用戶行為分析 業務背景 某購物APP最近上線了一個新功能&#xff0c;用戶簽到后可以跳轉到大轉盤抽獎&#xff0c;抽獎獲得的獎金可以抵消購物的費用&#xff0c;以此來培養用戶使用app的習慣。 數據表介紹 現有一張用戶行為表action_log&#xff0c;主要字段如下&#xff0c…

springboot mongodb 配置多數據源

我想要的效果是&#xff0c;一個類統一管理多數據源&#xff0c;我傳個參數進去&#xff0c;它就能返回我對應的mongotemplate 但是根據"mongbodb 多數據源"的關鍵詞&#xff0c;找不到我想要的效果。 網上大多都是明確知道自己是幾個數據源&#xff0c;然后每個數…

Styletron: 面向組件的樣式設計工具包

styletron官網&#xff1a; styletron的GitHub鏈接&#xff1a; styletron-react 一. 介紹 Styletron是一個通用的component-oriented&#xff08;面向組件的&#xff09;樣式工具。它屬于css-in-js類別。Styletron可以很好地與React配合使用&#xff0c;但也可以與其他框架或…

docker復現nginx錯誤配置漏洞

目錄 一、nginx環境搭建 1.1搭建步驟 二、docker復現Nginx配置漏洞 2.1安裝docker 2.2復現過程 2.1CRLF(carriage return/line feed)注入漏洞 2.2.目錄穿越 一、nginx環境搭建 1.1搭建步驟 1.先創建Nginx的目錄并進入&#xff08;命令如下&#xff09; mkdir /soft &&…

Android Framework底層原理之WMS的啟動流程

一 概述 今天&#xff0c;我們介紹 WindowManagerService&#xff08;后續簡稱 WMS&#xff09;的啟動流程&#xff0c;WMS 是 Android 系統中&#xff0c;負責窗口顯示的的服務。在 Android 中它也起著承上啟下的作用。 如下圖&#xff0c;就是《深入理解 Android》書籍中的…

033_小馳私房菜_Qcom平臺8系列-Dump Jpeg Jpeg Exif信息修改

全網最具價值的Android Camera開發系列資料~ 作者:8年Android Camera開發,從Camera app一直做到Hal和驅動~ 歡迎訂閱,相信能擴展你的知識面,提升個人能力~ 平臺:高通8系列 jpeg相關代碼邏輯在camx/src/swl/jpeg/ 路徑下 一、Dump Jpeg 有時我們想把hal這邊拍照的jpe…

【C++】STL初識

1.STL的基本概念 2.vector存放內置數據類型 #include <iostream> using namespace std; #include <vector> #include <algorithm>void MyPrint(int val) {cout << val << endl; }void test01() {//創建vector容器對象&#xff0c;并且通過模板參…

Harbor企業鏡像倉庫部署(本地)

簡述&#xff1a; Docker 官方鏡像倉庫是用于管理公共鏡像的地方&#xff0c;大家可以在上面找到想要的鏡像&#xff0c;也可以把自己的鏡像推送上去。但是有時候服務器無法訪問互聯網&#xff0c;或者不希望將自己的鏡像放到互聯網上&#xff0c;那么就需要用到 Docker Regis…

越南的區塊鏈和NFT市場調研

越南的區塊鏈和NFT市場調研 基本介紹 https://zh.wikipedia.org/wiki/%E8%B6%8A%E5%8D%97 語言文字&#xff1a; 越南語&#xff0c; 文字以國語字&#xff08;越南羅馬字&#xff09;為主&#xff0c;漢喃文&#xff08;漢字&#xff09; 貨幣&#xff1a;越南盾 人口(2022…

Leetcode-每日一題【劍指 Offer 15. 二進制中1的個數】

題目 編寫一個函數&#xff0c;輸入是一個無符號整數&#xff08;以二進制串的形式&#xff09;&#xff0c;返回其二進制表達式中數字位數為 1 的個數&#xff08;也被稱為 漢明重量).&#xff09;。 提示&#xff1a; 請注意&#xff0c;在某些語言&#xff08;如 Java&…

如何安全地移動WSL 2 到另一個驅動器

當您擁有小型 SSD 并且適用于 Linux 的 Windows 子系統 (WSL) 的大小呈指數增長時&#xff0c;這真的很痛苦。沒有簡單的方法將 WSL 安裝移動到另一個驅動器。在這篇博客中&#xff0c;我將討論如何通過小步解決這個問題。 1.打開具有管理員訪問權限的 PowerShell或命令提示符…

【Docker】Windows下docker環境搭建及解決使用非官方終端時的連接問題

目錄 背景 Windows Docker 安裝 安裝docker toolbox cmder 解決cmder 連接失敗問題 資料獲取方法 背景 時常有容器方面的需求&#xff0c;經常構建調試導致測試環境有些混亂&#xff0c;所以想在本地構建一套環境&#xff0c;鏡像調試穩定后再放到測試環境中。 Windows …

多線程與高并發--------線程池

線程池 一、什么是線程池 在開發中&#xff0c;為了提升效率的操作&#xff0c;我們需要將一些業務采用多線程的方式去執行。 比如有一個比較大的任務&#xff0c;可以將任務分成幾塊&#xff0c;分別交給幾個線程去執行&#xff0c;最終做一個匯總就可以了。 比如做業務操…

Windows電腦快速搭建FTP服務教程

FTP介紹 FTP&#xff08;File Transfer Protocol&#xff09;是一種用于在計算機網絡上進行文件傳輸的標準協議。它提供了一種可靠的、基于客戶端-服務器模型的方式來將文件從一個主機傳輸到另一個主機。在本文中&#xff0c;我將詳細介紹FTP的工作原理、數據傳輸模式以及常見…

數據結構【第4章】——棧與隊列

隊列是只允許在一端進行插入操作、而在另-端進行刪除操作的線性表。 棧 棧與隊列&#xff1a;棧是限定僅在表尾進行插入和刪除操作的線性表。 我們把允許插入和刪除的一端稱為棧頂&#xff08;top&#xff09;&#xff0c;另一端稱為棧底&#xff08;bottom&#xff09;&…

VBA技術資料MF42:VBA_從Excel中上面的單元格復制公式

【分享成果&#xff0c;隨喜正能量】唯有夢想才配讓你不安&#xff0c;唯有行動才能解除你的不安.繩鋸木斷&#xff0c;水滴石穿。也許你現在做的事情很小&#xff0c;只要你能日積月累的堅持下去&#xff0c;才會發現意義非凡。所謂的成功&#xff0c;便是別人失敗的時候你還在…

微服務與Nacos概述-2

微服務間消息傳遞 微服務是一種軟件開發架構&#xff0c;它將一個大型應用程序拆分為一系列小型、獨立的服務。每個服務都可以獨立開發、部署和擴展&#xff0c;并通過輕量級的通信機制進行交互。 應用開發 common模塊中包含服務提供者和服務消費者共享的內容 provider模塊是…

10-1_Qt 5.9 C++開發指南_Data Visualization實現數據三維顯示

Data Visualization 是 Qt 提供的用于數據三維顯示的模塊。在 Qt 5.7 以前只有商業版才有此模塊&#xff0c;而從Qt5.7 開始此模塊在社區版本里也可以免費使用了。Data Visualization 用于數據的三維顯示&#xff0c;包括三維柱狀圖、三維空間散點、三維曲面等。Data Visualiza…

鑒源實驗室丨汽車網絡安全攻擊實例解析(二)

作者 | 田錚 上海控安可信軟件創新研究院項目經理 來源 | 鑒源實驗室 社群 | 添加微信號“TICPShanghai”加入“上海控安51fusa安全社區” 引言&#xff1a;汽車信息安全事件頻發使得汽車行業安全態勢愈發緊張。這些汽車網絡安全攻擊事件&#xff0c;輕則給企業產品發布及產品…