go基本語法

跟Java比較學習。

hello word

示例代碼

test1.go文件:
// 包路徑
package main// 導入模塊,下面兩種都行
import ("fmt"
)
import "log"//  main方法
func main() {log.Print("hello word !!!")fmt.Print("hello word 222")
}

運行命令

go run .\test1.go

打包二進制

> go build .\test1.go

./test1.exe

變量可見性

首字母大寫就是public

首字母小寫就是private

{不能單獨一行

在Java和C中都可以,go中就不行

正確的應該這樣:

行結束不需要分號;

加上后IDE會自動給刪除

如果你就是要將兩行代碼放在一行,則需要在結尾加上;分號,但IDEA會在保存的時候自動給你拆分為兩行。

字符串

字符串連接+

格式化

// 格式化String.format
value := fmt.Sprintf("%s - %s", ">>", "<<")
// 打印到console上
fmt.Print(value)// 合并:格式化并打印出
fmt.Printf("%s - %s\n", ">>", "<<")

變量

變量申明和賦值

// 只聲明一個變量i
var i int
// 給i變量賦值2
i = 2
// 創建變量并賦值3
ii := 3
// 聲明常量
const pi float64 = 3.14var bo bool = false
bo1 := false
var f1 float32 = 1.1
var f2 = 1.2
f3 := 1.3

普通變量類型

uint8 unsiged int 8位

int8 有符號8位int

int16,int32,int64 類似,沒有long

float32、float64 容易理解,沒有double

這兩個不清楚:

complex64 32 位實數和虛數

complex128 64 位實數和虛數

不一樣的:

uintptr 無符號整型,用于存放一個指針

rune 類似 int32

byte 類似 uint8? 0到255

變量作用域

全局變量和局部變量可以名稱一致,但使用時會優先使用局部變量。

數組

一維數組

var strs = [3]string{"111", "222", "333"}
// 初始化數組中 {} 中的元素個數不能大于 [] 中的數字。 多出就會報錯
var strs = [3]string{"111", "222", "333","444"}
// 只初始化了前兩個元素
var strs = [3]string{"111", "222"}
// 數組長度根據后邊初始化數據的個數來確定為2
var strs = [...]string{"111", "222"}
// 初始化指定元素下表元素的數據
var strs = [...]string{1: "111", 4: "222"}
// 數組的長度
var length int = len(strs)
fmt.Println("數組長度:", length)
for i := 0; i < length; i++ {// 訪問和給數組賦值fmt.Println(len(strs[i]))strs[i] = "ab"
}

二維數組?

// 定義二位數組,并初始化
var rows = [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9},
}
fmt.Println(rows)// 二位數組一行一行添加
// [3][3]int{} 錯誤,行列取悅于append了多少次
var rows1 = [][]int{}
var row1 = []int{1, 2, 3}
var row2 = []int{4, 5, 6}
// 各行可以一樣,也可不一樣長
var row3 = []int{7, 8, 9, 10}
rows1 = append(rows1, row1)
rows1 = append(rows1, row2)
rows1 = append(rows1, row3)
fmt.Println(rows1)
fmt.Println("row count:", len(rows1))
fmt.Println("col count:", len(row1))
fmt.Println("row1 :", rows[0])
fmt.Println("row2 :", rows[1])
// 不允許訪問列 rows[][1]   syntax error: unexpected ], expected operand
// fmt.Println("col1 :", rows[][1])
fmt.Println("cell[1][1] :", rows[1][1])// 遍歷二維數組
for i := 0; i < len(rows1); i++ {for j := 0; j < len(rows1[i]); j++ {fmt.Println("cell[", i, "][", j, "] : ", rows1[i][j])}
}

方法參數傳數組和傳指針

// 包路徑
package mainimport "fmt"//  main方法
func main() {// 定義二位數組,并初始化var rows = [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9},}fmt.Println(rows)addRow(rows)fmt.Println(rows)// 傳遞二維數組的指針 &rowsaddRow1(&rows)fmt.Println(rows)// 調用固定元素數組參數,必須是固定元素個數數組// 數量不一致直接報錯row1 := [5]int{1, 2, 3, 4, 5}printRow(row1)// 將二維數組的第一行當做一維數組也不行// printRow(rows[0])
}// 數組是值類型,這么傳實際傳的是值而非引用
func addRow(rows [][]int) {row := []int{11, 22}rows = append(rows, row)
}// 接受一個二位數組的指針,就是地址
func addRow1(rows *[][]int) {row := []int{11, 22}*rows = append(*rows, row)
}//  必須這么調用:row1 := [5]int{1, 2, 3, 4, 5};    printRow(row1)
func printRow(row [5]int) {fmt.Println(row)
}

指針數組

// 定義指向數組的指針數組
ptr := []*int{&rows[0], &rows[1], &rows[2]}

指向指針的指針

var pptr **int
已經很熟悉了,不用再說了。

?結構體

基本語法

// 包路徑
package mainimport "fmt"// Book 全局可以使用
type Book struct {title stringauth  string
}//  main方法
func main() {// 定義結構體,只能在方法里邊用/*type Book struct {title stringauth  string}*/var book1 Bookbook1 = Book{"title1", "auth2"}book1 = Book{title: "title2"}// book2 獲取book1的值,最后那個也添加了個逗號,惡心不book2 := Book{title: book1.title,auth:  book1.auth,}book1.auth = "1000"// 傳值:不會修改值setAuth200(book2)// 傳地址:會修改值setAuth200Point(&book2)var book3 Book// 沒有book3 == nil 和 book3 == null這么一說// 是空對象相當于java中:book3 = new Book(); 不給里邊賦值,所以直接訪問不報錯fmt.Println(book3)book3.auth = "2000"
}// 真NM耐造,book為null 不會報錯
func setAuth200(book Book) {book.auth = "2000"
}func setAuth200Point(bookPtr *Book) {(*bookPtr).auth = "2000"
}

?繼承和匿名字段

type Person struct {name stringsex  stringage  int
}func (p *Person) say() {fmt.Println("person fun11")
}type Student struct {// 將Person中的屬性繼承過來 s1.sexPerson// 創建person屬性 s1.person.sexperson Personid     intaddr   string// 如果出現重名情況age int// 匿名字段string
}// 繼承和匿名字段
func main() {fmt.Println("main ...")s1 := Student{Person{"5lmh", "man", 20}, Person{"5lmh", "man", 20}, 1, "bj", 20, "匿名字段"}fmt.Println(s1)// 獲取person屬性的sex值fmt.Println(s1.person.sex)// 獲取繼承過來的person屬性sexfmt.Println(s1.sex)fmt.Println(s1.Person.sex)// 如果父子類中的屬性重復// 給父類Person中賦值s1.Person.age = 100// 給子類屬性age賦值s1.age = 200fmt.Println(s1)// 繼承還可以繼承方法s1.say()fmt.Println("success ...")
}

切片Slice

類似java的ArrayList?

var arr = []int{1, 2, 3, 4, 5}
fmt.Println(arr)// 切片類似:數組的 substring,前后是包含關系
sp := arr[0:]
fmt.Println(sp)
fmt.Println(len(sp))
fmt.Println(cap(sp))// 使用mark創建
var number = make([]int, 3, 5)
fmt.Println(number, len(number), cap(number))
// 在3個元素后邊添加
number = append(number, 5)
// out: [0 0 0 5] 4 5
fmt.Println(number, len(number), cap(number))
number = append(number, 6)
number = append(number, 7)
number = append(number, 8)
// 長度超過容量后會自動擴容,二倍擴容
number = append(number, 9)
number = append(number, 10)
//out:[0 0 0 5 6 7 8 9 10] 9 10
fmt.Println(number, len(number), cap(number))var number1 = make([]int, len(number)*2, cap(number)*2)
copy(number1, number)
// out:[0 0 0 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0] 18 20
// len內的數據會默認給0
fmt.Println(number1, len(number1), cap(number1))// 將里邊的數據全部清理為0
clear(number1)
// out:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 18 20
fmt.Println(number1, len(number1), cap(number1))

語言范圍Rang

?rang 類似 java中的 迭代器 foreach

數組

// 遍歷數組,index是下標
intArr := []int{1, 2, 3, 4, 5}
for index := range intArr {fmt.Print(index, "=", intArr[index], " ")
}
fmt.Println("")
// 可以直接將value遍歷出來
for index, value := range intArr {fmt.Print(index, "=", value, " ")
}
fmt.Println("")
// 如果不需要index則可以用_替代,否則由會給你報錯,這個變量沒用
for _, value := range intArr {fmt.Print(value, " ")
}

?Map

// map的遍歷
fmt.Println("")
map1 := make(map[int]string, 3)
fmt.Println(map1)
map1[10] = "aa"
map1[11] = "bb"
fmt.Println(map1)
// 遍歷map,當前key和value如果不用,可以用_替代
for key, value := range map1 {fmt.Println(key, ":", value)
}
// 如果只有一個同樣,遍歷的是key,類似數組的index
for key := range map1 {fmt.Println(key)
}

切片?

fmt.Println("")
// 切片也可以類似
spArr := make([]int, 2, 50)
copy(spArr, intArr[3:])
// out:[4 5]
fmt.Println(spArr)
for index := range spArr {fmt.Print(index, "=", intArr[index], " ")
}

channel?

// channel 看樣子類似java中的MQ,但不用那么復雜的實現機制
// chan int : 首先這個是一個通道channel, 然后是一個裝int的channel
// 類似:LinkedQuery<Integer>
ch := make(chan int, 10)
ch <- 11
ch <- 12
ch <- 1000for val := range ch {fmt.Print(val, " ")// 一邊遍歷,一邊可以添加數據,比ArrayList的強多了// 但這么搞就死循環了,邏輯上注意// ch <- 1000
}
// 最后需要關閉
close(ch)

Map集合?

// 創建 <int,string> 初始容量為2
mapCap := 2
map1 := make(map[int]string, mapCap)
fmt.Println(map1)// 添加元素,可相同會覆蓋
map1[11] = "bb"
fmt.Println(map1)
map1[11] = "bbb"
map1[22] = "ccc"
map1[33] = "ddd"
fmt.Println(map1)// 根據Key刪除元素
fmt.Println(len(map1))
delete(map1, 22)
fmt.Println(map1)
fmt.Println(len(map1))// 獲取元素,如果沒有則為空
fmt.Println("key:", 11, ",value:", map1[11])
fmt.Println("key:", 66, ",value:", map1[66])
// 如果有值則 value就是值,hasBollen為true,如果沒有值 hasBollen = false
value, hasBollen := map1[66]
if hasBollen {fmt.Println("數據存在,value:", value)
} else {fmt.Println("數據不存在,key:", 66)
}// 遍歷map
fmt.Println(map1)
for key, value := range map1 {fmt.Println("key:", key, ",value:", value)
}

方法

匿名方法?

func(i int, wg *sync.WaitGroup)為形參
(i, &wg) 為實際參數
var wg sync.WaitGroup
for i := 0; i < 10; i++ {wg.Add(1)go func(i int, wg *sync.WaitGroup) {fmt.Println(i)time.Sleep(20 * time.Microsecond)wg.Done()}(i, &wg)
}
wg.Wait()

接口Interface

不同點:

1. struct 實現 interface,并沒有明顯的實現寫法,各寫各的

2. struct 可以實現部分interface的方法,而不必要全部實現。直接用沒問題,用interface進行引用就報錯:

?

// 包路徑
package mainimport "fmt"// 接口有兩個方法
type Animal interface {call()getName() string
}// 創建類Market,有一個name熟悉
type Market struct {name string
}/**實現方法:1. (m Market): 標識 這個是Market類的方法2. call() 接口的方法
*/
func (m Market) call() {fmt.Println("market call,", "name:", m.name)
}func (m Market) getName() string {return m.name
}type Tiger struct {name string
}func (t Tiger) call() {fmt.Println("tiger call,", "name:", t.name)
}func (t Tiger) getName() string {return t.name
}func animalCall(a Animal) {a.call()
}// 空接口,可以接受任何類型的對象,并根據類型判斷
func print(v interface{}) {switch t := v.(type) {case int:fmt.Println("integer", t)case string:fmt.Println("string", t)}
}//  main方法
func main() {// 接口 interfacem1 := Market{name: "m111"}fmt.Println(m1.getName())m1.call()m2 := new(Market)m2.name = "m222"m2.call()t1 := Tiger{name: "t1111"}fmt.Println(t1.getName())t1.call()// 根據傳值的不同animalCall(m1)animalCall(t1)// 定義一個接口,然后復制類對象,按照接口調用就可以var a1 Animala1 = m1a1.call()// 將m1轉換為 Market類型m11 := a1.(Market)fmt.Println(m11.name)// 空接口接受人任何對象print(11)print("str11")}

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

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

相關文章

【Docker】如何在Linux、Windows、MacOS中安裝Docker

Linux安裝Docker 在終端中執行一鍵安裝腳本命令安裝docker sudo curl -fsSL https://gitee.com/tech-shrimp/docker_installer/releases/download/latest/linux.sh | bash -s docker --mirror Aliyun1.1 配置docker鏡像源 在終端執行 一行命令&#xff0c;編輯配置文件 sudo …

2.24力扣-回溯電話號碼的字母組合

17. 電話號碼的字母組合 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<String> ans new LinkedList<>();StringBuilder temp new StringBuilder();public List<String> letterCombinations(String digits) {if(digitsnull || digits.leng…

Cocos Creator Shader入門實戰(一):材質和Effect的了解

引擎版本&#xff1a;3.8.5 環境&#xff1a; Windows 簡介 在Cocos Creator中&#xff0c;游戲炫彩繽紛的效果是借助著色器(Shader)來實現的。 Cocos主要基于OpenGL ES&#xff0c;而Shader的編寫則是在可編程渲染管線中基于修改&#xff1a;頂點著色器(Vertex) 和 片段著色…

akka現有的分布式定時任務框架總結

根據你的需求&#xff0c;以下是一些基于 Akka 實現的分布式定時任務框架&#xff0c;以及相關的 GitHub 項目推薦&#xff1a; 1. Openjob Openjob 是一個基于 Akka 架構的新一代分布式任務調度框架&#xff0c;支持多種定時任務、延時任務、工作流設計&#xff0c;采用無中…

微信小程序地圖map全方位解析

微信小程序地圖map全方位解析 微信小程序的 <map> 組件是一個功能強大的工具&#xff0c;可以實現地圖展示、定位、標注、路徑規劃等多種功能。以下是全方位解析微信小程序地圖組件的知識點&#xff1a; 一、地圖組件基礎 1. 引入 <map> 組件 在頁面的 .wxml 文…

Python的PyTorch+CNN深度學習技術在人臉識別項目中的應用

人臉識別技術是一種基于人臉特征進行身份識別的生物識別技術&#xff0c;其核心原理包括人臉檢測、人臉對齊、特征提取、特征匹配、身份識別。 一、應用場景 安防&#xff1a;門禁、監控。 金融&#xff1a;刷臉支付、身份驗證。 社交&#xff1a;自動標注、美顏。 醫療&am…

《數據庫索引設計與優化》譯本錯誤糾正(1)

今天在學習《數據庫索引設計與優化》第十一章第198頁的時候遇到一個問題&#xff0c;即參數的文字描述與實際不符。我看的是從網絡上找到的譯本&#xff0c;許多喜歡白嫖的朋友可能也會像我一樣遇到這種問題。 可以看到&#xff0c;上面對參數Z的描述是&#xff1a;Z上一次索引…

API測試工具:Swagger vs Postman 2025最新全面對比

隨著微服務架構的普及和云原生應用的激增&#xff0c;高效的 API 開發、測試和文檔管理工具變得越來越重要。在眾多 API 工具中&#xff0c;Swagger 和 Postman 各自以不同的方式解決著 API 開發生命周期中的關鍵問題&#xff0c;本文將從多個維度深入對比這兩款工具&#xff0…

如何查詢SQL Server數據庫服務器的IP地址

如何查詢SQL Server數據庫服務器的IP地址 作為數據庫管理員或開發人員&#xff0c;了解如何查詢SQL Server數據庫服務器的IP地址是一項重要技能。本文將介紹幾種簡單而有效的方法&#xff0c;幫助你輕松獲取這一信息。無論你是新手還是經驗豐富的專業人士&#xff0c;這些方法…

centos 7 安裝python3 及pycharm遠程連接方法

安裝openssl 使用pip3安裝 virtualenv的時候會提示WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 這是因為缺少openssl 2.0以上版本 解決辦法&#xff1a; 一、先確認版本 openssl version 二、安…

AI人工智能之機器學習sklearn-數據預處理和劃分數據集

1、概要 本篇學習AI人工智能之機器學習sklearn數據預處理和劃分數據集&#xff0c;從代碼層面講述如何進行數據的預處理和數據集劃分。 2、簡介 本片講述數據預處理的標準化處理、歸一化處理&#xff0c;以常用的兩個類為例 標準化處理類 StandardScaler歸一化處理類 MinMax…

智能硬件-01智能停車場

行業背景 隨著現代人們生活水平的提高&#xff0c;私家車輛在不斷增加&#xff0c;小區將面臨著臨時車用戶要多于固定車用戶的窘境&#xff0c;尤其是在早晚高峰時段車輛出入擁堵&#xff0c;對小區的車輛管理難度越來越大&#xff0c;對停車場收費員的崗位要求越來越高&#…

定長內存池的實現、測試及錯誤分析

背景 C/C 申請內存使用的是 malloc &#xff0c;malloc 其實就是一個大眾貨&#xff0c;什么場景下都可以用&#xff0c;但是什么場景下都可以用就意味著什么場景下都不會有很高的性能。 定長內存池解決固定大小的內存申請釋放需求&#xff0c; 性能達到極致&#xff0c;不考…

vue3 下載文件 responseType-blob 或者 a標簽

在 Vue 3 中&#xff0c;你可以使用 axios 或 fetch 來下載文件&#xff0c;并將 responseType 設置為 blob 以處理二進制數據。以下是一個使用 axios 的示例&#xff1a; 使用 axios 下載文件 首先&#xff0c;確保你已經安裝了 axios&#xff1a; npm install axios然后在你…

Search API:讓數據獲取變得簡單高效的搜索引擎代理商

Search API&#xff1a;讓數據獲取變得簡單高效的搜索引擎代理商 在當今數字化時代&#xff0c;數據驅動的決策變得越來越重要&#xff0c;而獲取精準、實時的數據是眾多企業、研究機構和開發者的核心需求。然而&#xff0c;直接爬取搜索引擎或行業資訊網站可能會遇到諸多挑戰&…

halcon三維對象處理例程總結(二)

目錄 一、intersect_plane_object_model_3d二、interactive_intersection三、measure_plant四、moments_object_model_3d五、projective_trans_object_model_3d六、read_object_model_3d_generic_ascii一、intersect_plane_object_model_3d 計算三維物體模型與平面之間的相交部…

基于 Python 的項目管理系統開發

基于 Python 的項目管理系統開發 一、引言 在當今快節奏的工作環境中&#xff0c;有效的項目管理對于項目的成功至關重要。借助信息技術手段開發項目管理系統&#xff0c;能夠顯著提升項目管理的效率和質量。Python 作為一種功能強大、易于學習且具有豐富庫支持的編程語言&…

2月24(信息差)

&#x1f30d;“任意舞蹈任意學”&#xff01;宇樹機器人又進化了 傳Meta有意合作拋出橄欖枝 &#x1f384;兩部門&#xff1a;深入推進公路沿線充電基礎設施建設 推動大功率充電技術標準應用 ?小米15 Ultra、小米SU7 Ultra定檔2月27日 雷軍宣布&#xff1a;向超高端進發 1.…

mysql 遷移到人大金倉數據庫

我是在windows上安裝了客戶端工具 運行數據庫遷移工具 打開 在瀏覽器輸入http://localhost:54523/ 賬號密碼都是kingbase 添加mysql源數據庫連接 添加人大金倉目標數據庫 添加好的兩個數據庫連接 新建遷移任務 選擇數據庫 全選 遷移中 如果整體遷移不過去可以單個單個或者幾個…

C++和OpenGL實現3D游戲編程【連載23】——幾何著色器和法線可視化

歡迎來到zhooyu的C++和OpenGL游戲專欄,專欄連載的所有精彩內容目錄詳見下邊鏈接: ??C++和OpenGL實現3D游戲編程【總覽】 1、本節實現的內容 上一節課,我們在Blend軟件中導出經緯球模型時,遇到了經緯球法線導致我們在游戲中模型光照顯示問題,我們在Blender軟件中可以通過…