本文目錄一覽:
- 1、golang 方法返回的結構體為什麼取不到地址?
- 2、go語言 結構體作為返回值 傳的是指針嗎
- 3、golang函數返回slice和返回 slice的指針有什麼區別
- 4、golang os清空返回值
- 5、golang-指針類型
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語言為結構體指針專門準備的「-」運算符。
可以使用結構體指針,作為結構體的方法的參數以指代自身嗎,
go語言 結構體作為返回值 傳的是指針嗎
這個是根據你值的內容來定的啊,看代碼
type User struct {
Name string
}
//例1(返回指針)
func test1()*User{
return new(User)
}
//例2(返回指針)
func test2()*User{
return User{}
}
//例3(返回值)
func test3()User{
return User{}
}
明白沒有?
golang函數返回slice和返回 slice的指針有什麼區別
按照你的定義,slice是切片,而p是指針。切片是一個結構體頭部+數組區域,其頭部結構定義如下:struct Slice{ // must not move anythingbyte* array; // actual datauintgo len; // number of elementsuintgo cap; // allocated number of elements};因此,slice的返回其實是頭部值返回,函數內外的地址是不同的,這也導致主程序中,ss與pp不同。因為ss是新分配的,pp則是與子程序testInterface中的slice相同。簡單修改你的代碼,通過輸出對比,會非常清晰:package mainimport (“fmt”)func testInterface() (slice interface{}, p interface{}) {slice = make([]int, 10)p = slicefmt.Println(“debug:testInterface”)fmt.Println(slice)//兩個地址應該相同fmt.Println(p) //兩個地址應該相同return slice, p}func main() {fmt.Println(“debug:main”)ss, pp := testInterface()fmt.Println(ss)fmt.Println(pp) //應該與子程序的輸出一致}另外,第一個問題就不用多解釋,依然是值和指針不同了。
golang os清空返回值
方法如下
1,右值不可賦值
2,函數返回的是右值getTest()是右值,結構體整體都是右值,右值不可賦值getTestPoint()返回當然也是右值,但只有指針是右值,即你不能給返回的指針賦值(例如:getTestPoint() = nil),但是可以給指針指向的結構體成員賦值(就像你代碼里那樣)有右值自然就有左值,左值是可被賦值的。
golang-指針類型
tips: *號,可以指向指針類型內存地址上的值,號,可以獲取值類型的內存地址
每一個變量都有內存地址,可以通過變量來操作內存地址中的值,即內存的大小
go語言中獲取變量的內存地址方法:通過 符號可以獲取變量的地址
定義:普通變量存儲的是對應類型的值,這些類型就叫值類型
變量b,在內存中的地址為:0x1040a124,在這個內存地址上存儲的值為:156
定義:指針類型的變量存儲的是⼀個地址,所以⼜叫指針類型或引⽤類型
b 是值類型,它指向的是內存地址上的值
a是指針類型,它指向的是b的內存地址
指針類型定義,語法: var 變量名 *類型
指針類型在定義完成後,默認為空地址,即空指針(nil)
在定義好指針變量後,可以通過***** 符號可以獲取指針變量指向的變量
在這裡的 *a 等價於 b,通過修改 *a ,最終修改的是值類型b的值
這裡a,d是值類型,b,c是指針類型
d就相當於把a內存地址上值,在內存中從新開闢了一塊空間存儲,d和a互不影響
b,c相當於指向了a的內存地址,當使用*號引用出內存地址上的變量上,修改值得,a的值也會跟着改變
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/271996.html