久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

go中與java C++中應該注意的語法糖以及不同點是什么

160次閱讀
沒有評論

共計 2792 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關 go 中與 java C++ 中應該注意的語法糖以及不同點是什么,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

背景

最近在用 golang 寫 k8s operator(其中涉及到 informer controler)用于內部調度平臺用,剛好借此機會能夠與 java 版本的 informer controller 進行對比,由于之前對 golang 沒怎么接觸過,遇到了和 java c++ 不同的語法糖,現在列舉一下:

具體不同 glang 中 package

每個 Go 文件都屬于且僅屬于一個包,必須在源文件中非注釋的第一行指明這個文件屬于哪個包,如:package main,package main 表示一個可獨立執行的程序,
每個 Go 應用程序都包含一個名為 main 的包。package main 包下可以有多個文件,但所有文件中只能有一個 main () 方法,main () 方法代表程序入口

golang 中 struct

golang 中沒有 class 的概念, 但是有 struct,而且可以給 struct 增加方法, 如下:

type Member struct {
 Id int `json: id `
// 綁定到 Member 結構的方法, 但是這種不會改變 member 的值,因為結構體是值傳遞,當我們調用 setID 時,方法接收器接收到是只是結構體變量的一個副本,通過副本對值進行修復,并不會影響調用者,因此,我們可以將方法接收器定義為指針變量,就可達到修改結構體的目的
func (m Member)setId(id int){
 m.Id = id
m := Member{}
m.setId(1)
fmt.Println(m.Id)// 輸出為空
// 綁定到 Member 結構的方法, 會改變 member 的值  
func (m *Member)setId(id int){
 m.Id = id
m := Member{}
m.setId(1)
fmt.Println(m.Id)// 輸出為 1 

關于方法的接受者和接口如何被調用,參考如下:

不管方法的接收者是值還是指針,對象的值和指針均可以調用該方法型,那么方法的接受者可以是值類型也可以是指針類型

當方法的接收者是值時,不管是值調用還是指針調用,方法內部都是對原對象的副本進行操作,不會影響原對象型,那么方法的接受者必須也是值類型該方法才可以被調用

當方法的接收者是指針時,不管是值調用還是指針調用,方法內部都是通過指針對原對象進行操作,會影響原對象

注意:struct 的屬性可以沒有名字而只有類型,使用時類型即為屬性名。(因此,一個 struct 中同一個類型的匿名屬性只能有一個)

定義 struct 的 tags

在定義 strut 的結構體時,可以添加 tag,tag 可以在運行時用到,以及形成 json 或者 xml 時用到如下:

type NetworkList struct {
 Project `json: ,inline `
 f2 int `json: id,- `
 f3 string `json: f3,omitempty `
 f4 string `json: f4 `
type Project struct {
 Key string `json: key `
 Value string `json: value `
}

其中,
名詞 | 解釋 —|— json: ,inline | 表示內嵌類型的 key 和外層 struct 的 key 是平行關系,如 NetworkList 里的 key 和 Project key 在形成 json 的時候是平行關系,不是內嵌關系,也就是在同一級 json: id,- |-(橫杠)表示私有字段,形成 json 的時候不包括該 key json: f3,omitempty|omitempty 表示該字段為空,則生成 json 時,不包括該 key json: f4 | 表示生成 json 時,key 為 f4

golang 的類型轉換

c++ java 中有隱式類型轉換,golang 沒有,golang 中有強制類型轉換和類型斷言

強制類型轉換

package main
import  fmt 
func main() {
 var a float32 = 5.6
 var b int = 10
 fmt.Println (a * float32(b))
}

類型斷言

package main
import  fmt 
func main() { var a interface{} =10
 t,ok:= a.(int)
 if ok{ fmt.Println( int ,t)
 }
 t2,ok:= a.(float32)
 if ok{ fmt.Println( float32 ,t2)
 }
}

golang 中的 interface{}

interface{}是空接口沒有任何方法,且所有類型都實現了空接口,相當于 java 中的 object,interface 類型默認是一個指針

golang 中的 go 關鍵字

go 關鍵字用來創建 goroutine (協程),是實現并發的關鍵

//go  關鍵字放在方法調用前新建一個  goroutine  并讓他執行方法體
go GetThingDone(param1, param2);
// 上例的變種,新建一個匿名方法并執行
go func(param1, param2) {}(val1, val2)
// 直接新建一個  goroutine  并在  goroutine  中執行代碼塊
go { //do someting...}

golang 中的 defer 關鍵字

defer 的執行方式類似其他語言中的析構函數,在函數體執行結束后按照調用順序的相反順序逐個執行

即使函數發生嚴重錯誤也會執行,相當于 finally

常用于資源清理、文件關閉、解鎖以及記錄時間等操作

func main() { fmt.Println( a)
 
 defer fmt.Println(b)
 defer fmt.Println(c)
//b

golang 中的 init 函數

golang 的 init 函數在該文件被被引用時才執行(是 import 時,不是調用包函數時)

package lib
import  fmt 
func init() { fmt.Println( lib empty init )
package main
import (
  Test/lib 
  fmt 
func main() { fmt.Println( wint)
//  輸出
//lib empty init 
//wint

匿名函數

該用法和 java C++ 中差不多

func() { //func body}() // 花括號后加 () 表示函數調用,此處聲明時為指定參數列表, // 故調用執行時也不需要傳參

關于 go 中與 java C++ 中應該注意的語法糖以及不同點是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計2792字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 涟源市| 观塘区| 藁城市| 东辽县| 庆元县| 镇江市| 荆州市| 广州市| 阿瓦提县| 左贡县| 镇坪县| 郯城县| 新兴县| 登封市| 杭锦后旗| 阿城市| 山丹县| 洞头县| 同心县| 肥东县| 忻州市| 建平县| 安化县| 大新县| 阿鲁科尔沁旗| 阳山县| 左云县| 得荣县| 北碚区| 墨竹工卡县| 密山市| 汤原县| 吴桥县| 鄂尔多斯市| 商南县| 昭通市| 马关县| 高要市| 昆山市| 那曲县| 漳平市|