- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
考虑这个包:
package A
var X="change me"
var Y=func(i int) int { return i*i) }
func Z(i int) int { return -i) }
可以在另一个包中更改两个显式变量 (X,Y),例如 main...
package main
import "A"
func main () {
A.X="done"
A.Y=func (i int) int { return i*i*i }
print(A.X,A.Y(7))
//... but A.Z apparently can't be changed.
//A.Z=func (int i) int { return i*i*i } //main.go:8: cannot assign to A.Z
}
显然,定义函数变量(如 Y)和显式函数(如 Z)之间存在差异。我用谷歌搜索了这个但没有发现太多启蒙方式。看起来好像 var SomeFunc=func (...) 确实定义了一个变量,但 func SomeFunc(...) 定义了一个常量。
PS:我在研究这个时发现的一个小好东西,到目前为止我读过的 Go 书籍中没有提到过。包导入之前的一个点导入名称而无需限定它们:
package main
import . "A"
func main () {
X="done"
Y=func (i int) int { return i*i*i }
print(X,Y(7))
}
最佳答案
func SomeFunc()
,实质上创建了标识符 SomeFunc
到您定义的函数的强/常量/不可变绑定(bind)。当你像这样创建一个变量时:
var (
SomeFunc = func(i int) int {
return i * 2
}
)
您创建了一个func(int) int
类型的全局变量。您可以稍后重新分配此变量。这是您无法使用 func SomeFunc
标识符真正做到的事情。简单地说,这是因为 func SomeFunc()
将函数直接 绑定(bind)到标识符。 var SomeFunc
方法创建一个变量(在本例中类型为 func(int) int
),并且该变量使用您分配的函数进行初始化。与变量的情况一样:可以重新分配。
您可以对函数做的,是使用作用域变量隐藏它们。这可能会被大多数 linter 标记,但这是一种有时在测试中很有用的技术/技巧
至于点导入:除非有非常非常非常的充分理由,否则请不要这样做。一个很好的理由是您编写了一个包添加 到现有的包,因此您不再导入现有的包,而是导入您自己的包。将其视为扩展 一个包。 99% 的时间。无论您做什么,都不要在导入 encoding/json
以将 json 序列化注释添加到结构时使用它来消除错误。在这些情况下,使用下划线:
package foo
import (
"encoding/json"
)
type Bar struct {
Foobar string `json:"foobar"`
}
func New() *Bar {
&Bar{"Default foobar"}
}
不知道 golang 1.8,但这样的包可能会导致编译器错误(包编码/json 已导入但未使用)。要消除该错误,您只需将导入更改为:
import(
_ "encoding/json"
)
点包、下划线和包别名都遵循相同的规则:尽可能少地使用它们。
示例中使用的代码:
package main
import (
"fmt"
)
var (
SomeFunc = func(i int) int {
return i * 2
}
)
func main() {
fmt.Println(SomeFunc(2)) // output 4
reassign()
fmt.Println(SomeFunc(2)) // output 8
shadowReassign()
fmt.Println(SomeFunc(2)) // output 2
}
// global function
func reassign() {
// assign new function to the global var. Function types MUST match
SomeFunc = func(i int) int {
return i * 4
}
}
// assign function to local reassign variable
func shadowReassign() {
reassign := func() {
// same as global reassign
SomeFunc = func(i int) int {
return i
}
}
reassign()
}
关于戈朗 : implicit vs explicit func definition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43002880/
这是我的查询: INSERT INTO location_province(name, country) SELECT child.name ,location_country.id
尽管我看到 C++ 教程中广泛使用术语 implicit casting 来表示这样一个事实,即当您将某种类型分配给另一种类型时,类型的转换将自动(隐式)完成,但我经常听说应该叫implicit co
所有表格都在 utf_unicode_ci 中。 我这样做是为了检查 SELECT table_schema, table_name, column_name, character_set_name,
def MyFun(result: ListBuffer[(String, DateTime, List[(String, Int)])]): String = { val json = (r
我刚刚在 Postgres 中创建了一个表,并收到一条通知消息,我不完全理解隐式索引和序列。如有任何澄清,我们将不胜感激。 my_database=# CREATE TABLE sites my_da
我正在关注 Fernando Villalobos 的 React.js - A guide for Rails developers AirPair 教程。 这里的目标是使用 Rails 和 Rea
当我选择一个选项时,我有通过多选列表在 dbase 中搜索的代码我有这个错误: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (ut
我正在尝试使用 execl 调用来执行 kernel-space-driver (driver.c) 中的二进制文件此时(从第 850 行开始): if (!retval) {
我正在尝试在内核 3.13 上编译内核模块,但出现此错误: error: implicit declaration of function 'create_proc_read_entry' [-Wer
我检查了数据库表,发现它在 latin1_swedish_ci 中,所以我将其更改为 utf8_general_ci 然后我将排序规则从 latin1_swedish_ci 更改到所有字段的 utf8
尝试通过 MySQL 中的存储过程进行选择时出现以下错误 Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_ge
我收到了这个错误; Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)
我需要您帮助确定为什么会出现此错误 Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT
我收到了这个错误; Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)
MySql 上的错误信息: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) fo
在我的删除服务器上执行 MySQL 中的存储过程时,如下所示: CREATE OR REPLACE PROCEDURE `SetNextPage`( IN `inRefNo` varchar(
我正在尝试为 Kali linux 2.0 安装我的 Alfa AWUS036ACH 适配器 我已经修复了之前的错误,但现在我被困在这里了。这是错误我正在接收。 os_dep/linux/rtw_an
我们正在使用以下存储过程,并且所有提到的表都使用“Collation = utf8_general_ci”,但我们仍然收到此错误: Error Code: 1267. Illegal mix of
我想让我的 User 表的 password 列在 mysql 中区分大小写。 表的说明如下: /*Table: mst_user*/ FIELD TYPE
我对这一切都很陌生,正在尝试在内核版本为 3.10.0-957.el7.x86_64 的虚拟机上编译程序。但我收到此错误: /home/../../../isr_demux.c: In functio
我是一名优秀的程序员,十分优秀!