Go - void函数和直接赋值

时间:2017-06-08 11:32:05

标签: function go void assign

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

type Time struct{
    hour,min,sec int
}

这个初始化它的函数:

func init_Time(t Time) (int,int,int){
    t.hour, t.min, t.sec = time.Now().Clock()
    return t.hour, t.min, t.sec
}

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)
} 

我也导入了time个包。它完美无缺,但我有两个问题:

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

    t.hour,t.min,t.sec = time.Now()。Clock()

  2. main()

    Tm.hour, Tm.min, Tm.sec = init_Time(Tm)
    

    是否有必要或是我的错误?

    1. 为什么我通过将init_Time函数转换为void函数来修改"Time: 0:0:0"函数,它会返回值func init_Time(t Time) { t.hour, t.min, t.sec = time.Now().Clock() } ... func main(){ var Tm Time init_Time(Tm) fmt.Printf("Time: %d:%d:%d", Tm.hour, Tm.min, Tm.sec) } 而不是当前时间?
    2. (实施例:)

      {{1}}

1 个答案:

答案 0 :(得分:2)

调用任何函数(或方法)并传递值会生成值的副本,而在函数(或方法)中,您只能修改副本。因此,如果您未将第一个示例中的返回值分配给Time字段,则init_Time()中所做的更改会在函数返回时丢失。这也回答了你的第二个问题。

如果希望调用者观察更改,则必须将指针传递给您的值,并让该函数修改指向值。在这种情况下,甚至不需要返回(修改的)值:

func InitTime(t *Time) {
  t.hour, t.min, t.sec = time.Now().Clock()
}

使用它:

t := Time{}
InitTime(&t)
fmt.Printf("Time: %d:%d:%d\n", t.hour, t.min, t.sec)

输出(在Go Playground上尝试):

Time: 23:0:0

(请注意,Go Playground的当前时间始终从23:00:00开始。)

创建一个"构造函数"也是惯用的。喜欢功能:

func NewTime() *Time {
    t := &Time{}
    t.hour, t.min, t.sec = time.Now().Clock()
    return t
}

使用它:

t2 := NewTime()
fmt.Printf("Time: %d:%d:%d\n", t2.hour, t2.min, t2.sec)

输出相同。

参见相关问题:

Golang Operator Overloading

Copy instances of type T, when any of the methods of a named type T have a pointer receiver