Golang 须知知识点

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值