相关疑难解决方法(0)

指针与参数和返回值中的值

在Go中,有多种方法可以返回其struct值或片.对于我见过的个人:

type MyStruct struct {
    Val int
}

func myfunc() MyStruct {
    return MyStruct{Val: 1}
}

func myfunc() *MyStruct {
    return &MyStruct{}
}

func myfunc(s *MyStruct) {
    s.Val = 1
}
Run Code Online (Sandbox Code Playgroud)

我理解这些之间的差异.第一个返回结构的副本,第二个返回指向函数内创建的结构值的指针,第三个期望传入现有结构并覆盖该值.

我已经看到所有这些模式都在各种环境中使用,我想知道关于这些模式的最佳实践是什么.你什么时候用哪个?例如,第一个可能适用于小结构(因为开销很小),第二个适用于较大结构.第三个是你想要非常高效的内存,因为你可以在调用之间轻松地重用一个struct实例.有什么时候使用哪种最佳做法?

同样,关于切片的相同问题:

func myfunc() []MyStruct {
    return []MyStruct{ MyStruct{Val: 1} }
}

func myfunc() []*MyStruct {
    return []MyStruct{ &MyStruct{Val: 1} }
}

func myfunc(s *[]MyStruct) {
    *s = []MyStruct{ MyStruct{Val: 1} }
}

func myfunc(s *[]*MyStruct) {
    *s = []MyStruct{ &MyStruct{Val: 1} }
}
Run Code Online (Sandbox Code Playgroud)

再说一次:这里的最佳做法是什么.我知道切片总是指针,所以返回指向切片的指针是没用的.但是,如果我返回一片struct值,一块指向结构的指针,我应该将指向切片的指针作为参数传入(Go …

pointers go

295
推荐指数
4
解决办法
6万
查看次数

Go - void 函数和直接赋值

我在 Go 语言中遇到了一个小问题。我有这个结构:

type Time struct{
    hour,min,sec int
}
Run Code Online (Sandbox Code Playgroud)

以及初始化它的函数:

func init_Time(t Time) (int,int,int){
    t.hour, t.min, t.sec = time.Now().Clock()
    return t.hour, t.min, t.sec
}
Run Code Online (Sandbox Code Playgroud)

main

func main(){
   var Tm Time
   Tm.hour, Tm.min, Tm.sec = init_Time(Tm)
   fmt.Printf("Time: %d:%d:%d", Tm.hour, Tm.min, Tm.sec)
} 
Run Code Online (Sandbox Code Playgroud)

我也导入了time包。它工作得很好,但我有两个问题:

  1. 在我的代码中,为什么在函数中两次对变量(小时,分钟,秒)进行赋值init_Time

    t.小时、t.分钟、t.秒 = time.Now().Clock()

并在main()

Tm.hour, Tm.min, Tm.sec = init_Time(Tm)
Run Code Online (Sandbox Code Playgroud)

有必要还是我的错误?

  1. 为什么如果我init_Time通过将函数转换为 void 函数来修改该函数,它会返回值"Time: 0:0:0"而不是当前时间?

(例子:)

func init_Time(t Time) {
      t.hour, t.min, t.sec = time.Now().Clock()
} …
Run Code Online (Sandbox Code Playgroud)

function void go assign

0
推荐指数
1
解决办法
2万
查看次数

标签 统计

go ×2

assign ×1

function ×1

pointers ×1

void ×1