本文目錄一覽:
- 1、golang 方法返回的結構體為什麼取不到地址?
- 2、Golang入門到項目實戰 | golang並發變成之通道channel
- 3、變數的基本類型與零值 golang
- 4、golang中有類似其他語言的三目運算符的東西沒
- 5、Go語言基礎語法(一)
- 6、golang中map的key的類型
golang 方法返回的結構體為什麼取不到地址?
golang方法(method)返回值提取結構體(struct)取不到地址的原因是,①返回值並沒有保存到變數中,返回值本身只是臨時保存在程序運行的堆棧的某個不確定位置,不能取地址;②實參取地址用的操作符是是,而形參聲明變數類型為指針,需要地址值用的才是*;③聲明形參為指針的參數的實參只能為地址值。
故先把修改後的代碼列出,修改要點是把「*NewPerson1().Speak()」改為「var b=NewPerson1();(b).Speak()」,同時把「NewPerson2().Speak()」改成「var a=NewPerson2();(a).Speak()」,代碼列出如下:
package main;
import “fmt”;
type PersonA struct{
name string
}
func (p *PersonA) Speak () {
fmt.Println ( “person speak” ,p.name)
}
func (p PersonA) Walk ( ){
fmt . Println ( “person walk”,p.name)}
func NewPerson1()(p PersonA){
return PersonA{“new Person1”}}
func NewPerson2()(p PersonA){
return PersonA{“new Person2”}}
func main () {
var a=NewPerson2 (); (a).Speak ();
a .Walk ();
fmt. Println (“——————–“) ;
var b=NewPerson1 ();(b).Speak ();
b.Walk ()}
go代碼調試效果
關於指針變數的使用這一點go語言和其他有指針的程序語言如c語言是一樣的,從來只有返回值為地址/指針,而從沒有在賦值前給返回值取地址這種運算,類似的錯誤晚點再整理。
不一樣的是,go語言更簡單go語言函數可以使用結構體或者結構體的指針(pointer)以傳遞結構體參數,而且和c語言不一樣的是,go語言沒有區分結構體指針和結構體訪問成員的運算符,go語言只有「.」適用於兩種情況,而沒有c語言為結構體指針專門準備的「-」運算符。
可以使用結構體指針,作為結構體的方法的參數以指代自身嗎,
Golang入門到項目實戰 | golang並發變成之通道channel
Go提供了一種稱為通道的機制,用於在goroutine之間共享數據。當您作為goroutine執行並發活動時,需要在goroutine之間共享資源或數據,通道充當goroutine之間的管道(管道)並提供一種機制來保證同步交換。
根據數據交換的行為,有兩種類型的通道:無緩衝通道和緩衝通道。無緩衝通道用於執行goroutine之間的同步通信,而緩衝通道用於執行非同步通信。無緩衝通道保證在發送和接收發生的瞬間兩個goroutine之間的交換。緩衝通道沒有這樣的保證。
通道由make函數創建,該函數指定chan關鍵字和通道的元素類型。
這是創建無緩衝和緩衝通道的代碼塊:
語法
使用內置函數make創建無緩衝和緩衝通道。make的第一個參數需要關鍵字chan,然後是通道允許交換的數據類型。
這是將值發送到通道的代碼塊需要使用-運算符:
語法
一個包含5個值的緩衝區的字元串類型的goroutine1通道。然後我們通過通道發送字元串「Australia」。
這是從通道接收值的代碼塊:
語法
– 運算符附加到通道變數(goroutine1)的左側,以接收來自通道的值。
在無緩衝通道中,在接收到任何值之前沒有能力保存它。在這種類型的通道中,發送和接收goroutine在任何發送或接收操作完成之前的同一時刻都準備就緒。如果兩個goroutine沒有在同一時刻準備好,則通道會讓執行其各自發送或接收操作的goroutine首先等待。同步是通道上發送和接收之間交互的基礎。沒有另一個就不可能發生。
在緩衝通道中,有能力在接收到一個或多個值之前保存它們。在這種類型的通道中,不要強制goroutine在同一時刻準備好執行發送和接收。當發送和接收阻塞時也有不同的條件。只有當通道中沒有要接收的值時,接收才會阻塞。僅當沒有可用緩衝區來放置正在發送的值時,發送才會阻塞。
實例
運行結果
變數的基本類型與零值 golang
go程序編寫規範:
以上是 golang 中的基本類型,有很多類型只了解了基本概念,還不知道怎麼在實際編碼中怎麼去使用在什麼場景中使用。
類型的零值,當一個類型聲明了但是並沒有賦值,會有一個相對應的默認值給這個類型。
對於包的引入,一定要用雙引號,變數的字元串聲明也要用雙引號包起來,不然程序運行會報錯。
var 聲明變數, var 變數名 類型=值或函數 ,變數名真的可以是中文,再也不怕詞窮不知道起變數名了,當然,能用英文是最好的了。
在聲明變數的同時也可以不用聲明類型,系統會自動推斷,在能夠確定類型的情況最好還是寫上去。
也可以不用 var 關鍵字只要在等號左邊加上一個 : 冒號就可以了,但我也不喜歡這樣做, 我希望一切都是顯式的 。
變數組,在全局可以使用 var() 括弧裡面寫變數, 在方法體裡面需要使用並行變數聲明
例如 var a,b,c int =1,2,3 。
空白符,var a,_,c int = 1,2,3,在這裡2這個值就被忽略了。
還有一種賦值方法 a:=1 ,這種賦值方法省略了 var 關鍵字與類型,這種方法在以後說是會用很大的用處。
類型轉換,go 當中的所有類型轉換必須是顯式轉換,同類型轉換,比如 int 可以和浮點互換,
var a =1.1 b:= int(a) ,將ab列印出來是1.1和1。
還可以將 int 轉為 string,列印出來就不一樣了。下一博文寫為什麼不一樣和常量運算符
原文鏈接: 變數的基本類型與零值-GOLANG
golang中有類似其他語言的三目運算符的東西沒
沒有的,go中只能這樣
var a int
if x 0 {
a = 1
} else {
a = 2
}
Go語言基礎語法(一)
本文介紹一些Go語言的基礎語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執行結果:
下面來進一步介紹go的基礎語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執行結果:
更多格式化方法可以訪問中的fmt包。
log包實現了簡單的日誌服務,也提供了一些格式化輸出的方法。
執行結果:
下面來介紹一下go的數據類型
下表列出了go語言的數據類型:
int、float、bool、string、數組和struct屬於值類型,這些類型的變數直接指向存在內存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執行結果:
執行結果:
Go 語言的運算符主要包括算術運算符、關係運算符、邏輯運算符、位運算符、賦值運算符以及指針相關運算符。
算術運算符:
關係運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯用,這裡不做介紹。
if語法格式如下:
if … else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執行後面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執行結果:
下面介紹幾種循環語句:
執行結果:
執行結果:
也可以通過標記退出循環:
–THE END–
golang中map的key的類型
golang 中 map 的 key 必須是可比較的,再簡單點是可以使用 == 運算符進行比較。
很顯然 slice,map,function 不可以,
所以 數字、string、bool、array、channel、指針可以,以及 包含前面類型的 struct
leetcode 49 題 所以恰好要取一個 string 的 hash 值,題解中大神雲集,各種質數相乘,字元排序後作為 key 的,更有甚者將數組作為 key,我覺得很巧妙都很巧妙。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/192331.html