(1)同级目录不能放多个包,否则报编译错误;
getLocalIP.go:8:5: found packages test (test.go) and test1 (test1.go) in /data/goTest/src/getLocalIP/test
(2)实现一个接口需要实现接口中的所有方法。
(3)Go 中根据首字母的大小写来确定可以访问的权限。方法名、结构体名、结构体成员名、常量、变量名等,如果首字母大写,则可以被导出,即可以被其他的包访问;如果首字母小写,则不可导出,只能在本包中使用。可以简单的理解成,首字母大写是公有的,首字母小写是私有的。
(4)import 写的到底是目录名还是包名,包名是不是必须和目录名一致?
结论:import 的时候写的是目录名,引用的时候写的是包名。包名不必和目录名一致,但为了更好的维护和更高的可读性,普遍的做法是包名和目录名一致。
(5)cannot assign to struct field xxx in map。
Go 中无法在 map 中给 struct 成员赋值。
package main
import “fmt”
var m = map[string]struct{x, y int} {
“foo”: {2, 3},
}
func main() {
m[“foo”].x = 4 // cannot assign to m[“foo”].x
fmt.Println(m)
}
这个issue #3117截止至 go 1.12.1 仍未解决。这里有两个可行的解决办法。
一是使用指针指向struct。
package main
import "fmt"
var m = map[string]*struct{x, y int} {
"foo": {2, 3},
}
func main() {
m["foo"].x = 4
fmt.Println(m["foo"].x)
}
二是使用临时struct对象。
package main
import "fmt"
var m = map[string]struct{x, y int} {
"foo":{2, 3},
}
func main() {
tmp:=m["foo"]
tmp.x=4
m["foo"]=tmp
fmt.Println(m["foo"].x)
}
(6)Go 函数支持默认参数吗?
Go 中函数不支持默认参数,这个要从 Go 语言的设计思想来说了,Go 语言追求显式的表达,避免隐含,提高了代码的可读性。这种设计在其面向对象的语法中尤其明显。
package test
struct clstest {
int a
int b
int c
}
func (this *clstest) sum() int{
return this.a + this.b + this.c
}
从上面一段代码可以看出来,它把其他语言中隐含的 this 指针显式化了那么在Go语言的函数中,同样也追求显式表达,于是就把参数默认值这个其他语言常见的功能去掉了。事实上在我使用Go语言的过程中,对于参数不支持默认值这一点并没有感觉有什么不适,而且用到参数默认值的地方也不多。
(7)Golang支持函数重载吗?
不支持。
(8)Golang信道的只读和只写。
(a)只读channel的声明。
var <变量名字> <-chan <type>
// 示例
var readChan <- chan int
(b)只写channel的声明。
var <变量名字> chan<- <type>
// 示例
var writeChan chan<- int
(9)变量申明方式
# var 申明
var i int
# var 申明指定值
var i int = 1
# var 申明省略变量类型
var i = 1
# var 一行申明多个
var i, j int
# 短声明格式,不能指明类型且只限于函数内
i := 1
# 短声明格式,一行申明多个,只限于函数内
i, j := 1, 2
参考文献
golang的命名规范及大小写的访问权限
Golang relative package import after renaming
You cannot assign a struct field off map directly in golang
知乎.golang函数中的参数为什么不支持默认值?
golang基础-chan的select操作、定时器操作、超时控制、goroutine中使用recover