柚子快報邀請碼778899分享:開發(fā)語言 Golang快速上手
柚子快報邀請碼778899分享:開發(fā)語言 Golang快速上手
背景
本文目的旨在,大家看完文章就能上手進行Golang的業(yè)務(wù)開發(fā)實現(xiàn)需求,屬于一篇Golang速成,如果有相關(guān)基礎(chǔ),后邊會再出一篇高級篇,用來給大家做一下比較深入的討論。
技術(shù)架構(gòu)
Golang的設(shè)計目標之一是提高開發(fā)效率和代碼可維護性,其技術(shù)架構(gòu)也反映了這一點。
標準庫
標準庫的數(shù)量和質(zhì)量常常決定了我們在開發(fā)過程中的上線,和其他主流開發(fā)語言一樣,Golang擁有豐富的標準庫,涵蓋了從輸入/輸出、字符串處理、網(wǎng)絡(luò)編程到數(shù)據(jù)序列化等各個方面。這使得開發(fā)者可以快速構(gòu)建功能齊全的應用程序,而無需依賴第三方庫。
并發(fā)模型
Golang的并發(fā)模型基于goroutine和channel。Goroutine是輕量級的線程,創(chuàng)建和銷毀的開銷很小。Channel則用于在goroutine之間傳遞消息和數(shù)據(jù),實現(xiàn)高效的并發(fā)編程。在使用channel來進行并發(fā)處理的時候,大家會發(fā)現(xiàn)實現(xiàn)極其簡單,不同水平的開發(fā)人員寫出的代碼幾乎相差無幾。
靜態(tài)類型
Golang是靜態(tài)類型語言,這意味著所有變量的類型在編譯時確定。
編譯和工具鏈
Golang的編譯器非常高效,可以快速編譯代碼生成可執(zhí)行文件。Golang的工具鏈還包括自動化測試、代碼格式化、靜態(tài)分析等工具,進一步提高了開發(fā)效率。同時還包含了RPC這種框架下的十分簡潔的上下游調(diào)用鏈,對于開發(fā)來說會是一個比較舒服的調(diào)用過程
基礎(chǔ)知識
ok,熱身完畢,現(xiàn)在我們來聊一下Golang的一些基礎(chǔ)知識,保證大家看完后可以立馬上手開發(fā)。 安裝和配置環(huán)境 要開始使用Golang,首先需要安裝Golang的開發(fā)環(huán)境。你可以從Golang官方網(wǎng)站下載并安裝相應版本。安裝完成后,配置環(huán)境變量: 下面展示一些 內(nèi)聯(lián)代碼片。
export PATH=$PATH:/usr/local/go/bin
第一個程序
一個典型的Golang程序如下:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
上述代碼定義了一個簡單的main包,并在main函數(shù)中輸出"Hello, World!"。
包管理
Golang的包管理是Golang極具特色的一個能力,相比于Java中多模塊下多pom的管理方式,Golang的包管理更為簡潔 每個包代表一個獨立的功能模塊,可以被其他包導入和使用。包的定義如下:
package math
func Add(a int, b int) int {
return a + b
}
編譯和運行
使用go run命令可以直接運行Golang程序,當然如果用開發(fā)工具的話直接點點就可以了: go run main.go
使用go build命令可以編譯程序生成可執(zhí)行文件: go build -o myapp main.go
數(shù)據(jù)類型
Golang提供了豐富的數(shù)據(jù)類型,包括基本類型和復合類型。 整數(shù)類型:int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64 浮點類型:float32, float64 布爾類型:bool 字符串類型:string 復合類型(非常重要,非常重要,非常重要,因為Golang中沒有太花里胡哨的東西,下面三個復合類型就囊括了99.99%的開發(fā)中使用的數(shù)據(jù)類型) 數(shù)組:固定長度的同類型元素的集合 切片:動態(tài)數(shù)組,可以改變長度 映射(map):鍵值對集合 結(jié)構(gòu)體(struct):自定義類型,將多個字段組合在一起 示例代碼
package main
import "fmt"
func main() {
// 基本類型
var i int = 10
var f float64 = 3.14
var b bool = true
var s string = "Golang"
fmt.Println(i, f, b, s)
// 數(shù)組
var arr [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Println(arr)
// 切片
var slice []int = []int{1, 2, 3}
fmt.Println(slice)
// 映射
var m map[string]int = map[string]int{"one": 1, "two": 2}
fmt.Println(m)
// 結(jié)構(gòu)體
type Person struct {
Name string
Age int
}
var p Person = Person{Name: "Alice", Age: 25}
fmt.Println(p)
}```
數(shù)組 數(shù)組是固定長度的同類型元素的集合。聲明數(shù)組時需要指定長度。
var arr [5]int
arr[0] = 1
fmt.Println(arr)
切片 切片是動態(tài)數(shù)組,可以改變長度。切片比數(shù)組更靈活,使用更頻繁。
slice := []int{1, 2, 3}
slice = append(slice, 4)
fmt.Println(slice)
映射
映射(map)是一種鍵值對集合。鍵和值可以是任意類型。
m := make(map[string]int)
m["one"] = 1
fmt.Println(m)
結(jié)構(gòu)體 結(jié)構(gòu)體(struct)是一種聚合數(shù)據(jù)類型,將多個字段組合在一起。注意一下,struct還可以當作一個類的專屬名稱來使用
type Person struct {
Name string
Age int
}
p := Person{Name: "Bob", Age: 30}
fmt.Println(p)
//除此之外還可以這么用
func (Person *h)insert(int id){
//邏輯放在這里
//上面的參數(shù)就可以當作公有變量在這個類中使用
}
錯誤處理
Golang使用內(nèi)置的error接口來處理錯誤。函數(shù)返回值通常包括結(jié)果和錯誤信息。這里錯誤處理還有一種defer的用法,可以來做一些兜底操作和處理,不過這篇文章主要是讓大家快速上手和熟悉Golang這里就不做講解了,感興趣的大家可以自行搜索。 示例代碼
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
func main() {
result, err := divide(4, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
}
開發(fā)常用
基礎(chǔ)知識了解完畢就來聊一下開發(fā)中幾乎必用的一些能力吧。
thrift
Thrift是一個用于跨語言服務(wù)開發(fā)的框架。Golang支持使用Thrift生成客戶端和服務(wù)器代碼。 安裝Thrift 安裝Thrift編譯器: brew install thrift 使用Thrift 定義Thrift接口文件,相當于Java中的swagger,但是這里更為直觀例如service.thrift:
namespace go tutorial
service Calculator {
i32 add(1: i32 num1, 2: i32 num2)
}
生成Golang代碼:
thrift -r --gen go service.thrift
并發(fā)
Golang以其強大的并發(fā)模型而著稱。Golang中的并發(fā)編程基于goroutine和channel。 Goroutine
Goroutine是輕量級的線程,使用go關(guān)鍵字啟動。
go func() {
fmt.Println("Hello from a goroutine")
}()
Channel
Channel用于在goroutine之間傳遞消息和數(shù)據(jù)。
ch := make(chan int)
go func() {
ch <- 42
}()
fmt.Println(<-ch)
然后可以以此堆疊,因為Golang的特性,你堆疊幾十個乃至上百個都不會影響性能,所以在開發(fā)的過程中就要求下游只提供最基礎(chǔ)的查詢,然后全用并發(fā)來拼接,最后在上游完成處理。 數(shù)據(jù)庫 Golang提供了多種數(shù)據(jù)庫驅(qū)動,可以連接和操作不同類型的數(shù)據(jù)庫。常見的數(shù)據(jù)庫驅(qū)動有database/sql和gorm。
連接數(shù)據(jù)庫
使用database/sql連接和操作數(shù)據(jù)庫:
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
查詢數(shù)據(jù) 執(zhí)行SQL查詢:
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
常見問題
在實際的Golang開發(fā)過程中,可能會遇到各種各樣的問題。以下是一些常見問題及其解決方案。
Thrift版本問題
問題描述: 在使用Thrift進行跨語言服務(wù)開發(fā)時,可能會遇到Thrift版本不兼容的問題。這可能會導致生成的代碼無法正常工作。 解決方案: 確保所有使用Thrift的項目使用相同的Thrift編譯器版本。 使用go.mod文件來管理Thrift庫的版本,確保所有依賴的一致性。 如果遇到版本不兼容的問題,可以嘗試升級或降級Thrift編譯器版本,或者手動修改生成的代碼以兼容當前版本。 示例: 在項目的go.mod文件中指定Thrift庫的版本: module your_module_name
go 1.18
require ( github.com/apache/thrift v0.13.0 )
新引入依賴不生效
問題描述: 在項目中引入新的依賴包后,發(fā)現(xiàn)依賴包無法生效,導致編譯錯誤或運行時錯誤。 解決方案: 確保已經(jīng)正確添加新的依賴包,并運行了go mod tidy或go mod vendor命令來更新依賴。 檢查項目的go.mod文件,確保新引入的依賴包已經(jīng)被正確添加。 如果使用了IDE,嘗試重啟IDE以刷新依賴緩存。 確保沒有使用舊版本的依賴包,可以嘗試刪除go.sum文件并重新運行g(shù)o mod tidy。 示例: 在項目中引入新的依賴包并更新依賴:
go get github.com/gin-gonic/gin
go mod tidy(這個命令有事沒事就可以敲一下,能解決7成左右的問題)
總結(jié) 本文介紹了Golang的基礎(chǔ)知識,涵蓋了從數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)、錯誤處理到并發(fā)編程和數(shù)據(jù)庫操作的各個方面。通過閱讀本文,讀者應當能夠掌握Golang的基本概念和編程技巧,并能夠上手進行實際的開發(fā)。
package main
import (
"database/sql"
"errors"
"fmt"
"log"
"os"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 基本數(shù)據(jù)類型
var i int = 10
var f float64 = 3.14
var b bool = true
var s string = "Golang"
fmt.Println(i, f, b, s)
// 數(shù)組
var arr [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Println(arr)
// 切片
var slice []int = []int{1, 2, 3}
slice = append(slice, 4)
fmt.Println(slice)
// 映射
var m map[string]int = map[string]int{"one": 1, "two": 2}
fmt.Println(m)
// 結(jié)構(gòu)體
type Person struct {
Name string
Age int
}
var p Person = Person{Name: "Alice", Age: 25}
fmt.Println(p)
// 錯誤處理
result, err := divide(4, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
// 日志
log.Println("This is a log message")
// 配置管理
dbHost := os.Getenv("DB_HOST")
fmt.Println("DB Host:", dbHost)
// 并發(fā)
ch := make(chan int)
go func() {
ch <- 42
}()
fmt.Println(<-ch)
// 數(shù)據(jù)庫連接
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 數(shù)據(jù)庫查詢
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
}
// divide 函數(shù)用于演示錯誤處理
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
柚子快報邀請碼778899分享:開發(fā)語言 Golang快速上手
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。