Go - void函数和直接赋值
Go - void function and direct assignment
我的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
包。它运行良好,但我有 2 个问题:
在我的代码中,为什么在 init_Time
函数中对变量 (hour,min,sec) 赋值两次:
t.hour, t.min, t.sec = time.Now().Clock()
并在 main()
中:
Tm.hour, Tm.min, Tm.sec = init_Time(Tm)
有必要还是我的错误?
- 为什么如果我通过将
init_Time
函数转换为 void 函数来修改它,它 returns 值 "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)
}
调用任何函数(或方法)并传递值都会生成值的副本,并且在函数(或方法)内部您只能修改副本。因此,如果您不将第一个示例中的 return 值分配给 Time
的字段,则在 init_Time()
中所做的更改会在函数 return 时丢失。这也回答了你的第二个问题。
如果你想让调用者观察变化,你必须传递一个指针给你的值,并让函数修改pointed 价值。在这种情况下,甚至不需要 return (修改后的)值:
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 开始。)
另外,创建一个 "constructor" 类函数也是惯用的:
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)
输出相同。
查看相关问题:
我的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
包。它运行良好,但我有 2 个问题:
在我的代码中,为什么在
init_Time
函数中对变量 (hour,min,sec) 赋值两次:t.hour, t.min, t.sec = time.Now().Clock()
并在 main()
中:
Tm.hour, Tm.min, Tm.sec = init_Time(Tm)
有必要还是我的错误?
- 为什么如果我通过将
init_Time
函数转换为 void 函数来修改它,它 returns 值"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)
}
调用任何函数(或方法)并传递值都会生成值的副本,并且在函数(或方法)内部您只能修改副本。因此,如果您不将第一个示例中的 return 值分配给 Time
的字段,则在 init_Time()
中所做的更改会在函数 return 时丢失。这也回答了你的第二个问题。
如果你想让调用者观察变化,你必须传递一个指针给你的值,并让函数修改pointed 价值。在这种情况下,甚至不需要 return (修改后的)值:
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 开始。)
另外,创建一个 "constructor" 类函数也是惯用的:
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)
输出相同。
查看相关问题: