55 筆記go語言 go型別

2021-08-09 02:25:37 字數 2590 閱讀 5059

很多人喜歡go語言的原因是簡單。go語言的型別也是設計的如此簡單。

go語言預設定義了一些型別如boolean,numeric和string.這些預定義的型別用於構建其他複雜的型別,例如array,struct,pointer,slice,map,channel等。

型別可以有乙個名字也可以沒有名字。

命名的型別可以有他們自己的函式集。

type map map[string]string

//this is valid

func (m map) set(key string, value string)

//this is invalid

func (m map[string]string) set(key string,value string)

以上**中,定義了乙個方法,使用map作為接受。如果使用乙個沒有命名的型別例如map[string]來作為接受那麼是非法的。

預定義的型別也叫作命名型別。所以int是命名型別,但是*int或int則不是。

每個型別都有乙個基礎型別。預定義型別和型別字元將就是本身的基本型別。

當定義乙個新型別的時候,需要提供乙個存在的型別。乙個新型別會和存在的型別有相同的基本型別。

例如:

type map map[string]string
type specialmap map

這裡,map[string]string的基礎型別就是他本身,但是map和specialmap的基本型別是map[string] string

宣告的型別不會從存在的型別或基本型別中繼承任何方法。但是,複雜型別的介面方法集和元素會保持不變。這主要是考慮到,如果你定義了乙個新型別,那麼就需要定義乙個方法集。

type mystring string
var str string = "abc"
var my_str mystring = str //gives a compile error

如上**。

不能將乙個不同型別的進行賦值。因為my_str和str的型別是不同的了。哈哈

基本上,賦乙個值給變數,值的型別應該和變數型別統一。如果基本型別一致並且其中乙個是未命名的也可以賦值。

例如:

package main
import "fmt"
type person map[string]string
type job map[string]string
func keys(m map[string]string) (keys string)
return
}
func name(p person) string
func main()
var job = job
fmt.printf("%v\n", name(person))
fmt.printf("%v", name(job)) //this gives a compile error
fmt.printf("%v\n", keys(person))
fmt.printf("%v\n", keys(job))
}

這裡person和job的基本型別是map[string]string. 如果將型別job的例項傳遞給函式就會報乙個編譯錯誤。但是可以將job和person的例項傳遞給keys函式,因為keys函式是未命名的map[string] string型別。

當定義乙個型別的時候,不會整合型別的方法集。但是,有個方法可以在新型別中嵌入已存在型別方法集。通過在結構型別中使用匿名域的屬性。當在結構中定義乙個匿名域的時候,所有域和方法會給定義的結構型別。

如下:package main

type user struct

type employee struct

func (u *user) setname(name string)

func main()

user型別的域和方法提供給了employee

因為在employee結構體中是匿名方式定義的user.

基本上,在命名的型別和基本型別之間可以進行轉換。

例如:type mystring string

var my_str mystring =mystring("awesome")

var str string = string(my_str)

和string型別轉換不同,所有其他轉換只需要修改型別而不需要修改值。

可以將string轉換給乙個integers的slice或者反過來。

在使用介面和反射時候可以會有更多穩定和複雜的型別操作。

10 筆記go語言 併發

10.筆記go語言 併發 goroutine 是由 go 執行時環境管理的輕量級執行緒。go f x,y,z 開啟乙個新的 goroutine 執行 f x,y,z f x y 和 z 是當前 goroutine中定義的,但是在新的 goroutine 中執行 f goroutine 在相同的位址空...

34 筆記go語言 內建函式

34.筆記go語言 內建函式 預定義了少數函式,這意味著無需引用任何包就可以使用它們。close 用於channel通訊。使用它來關閉channel.delete 用於在map中刪除例項。len和cap 可用於不同的型別,len用於返回字串 slice和陣列的長度。new 用於各種型別的記憶體分配。...

37 筆記go語言 包

37.筆記go語言 包 包是函式和資料的集合。用package保留字定義乙個包。檔名不需要與包名一致。包名的約定是使用小寫字元。go包可以由多個檔案組成,但是使用相同的package 這一行。讓我們在檔案even.go中定義乙個叫做even的包。名稱以大寫字母起始的是可匯出的,可以在包的外部呼叫.在...