Golang语言中存在一个关键字type,type又有两种使用方式,一种是类型别名,一种是类型定义。
GoLang1.9后对內建定义类型使用了新的写法:
type NewName = Type
这个NewName只是Type的别名。NewName和Type是一致的类型。
而类型定义,则是会产生新的类型。虽然新类型和旧类型是一样的类型。但会被认为是不同的类型名字。
type NewName Type
type Student struct {
name String
age int
}
type Teacher Student
相当于定义了一个新的Teacher类型,和下面的代码是等价的。虽然两个类型内存布局完全一样,但是从概念上来说,他们是完全不同的两个类型,不能相互兼容。
type Teacher struct {
name String
age int
}
类型别名这个功能非常有用,鉴于go中有些类型写起来非常繁琐,比如json相关的操作中,经常用到map[string]interface {}这种类型,写起来是不是很繁琐,没关系,给它起个简单的别名!这样用起来爽多了。
type strMap2Any = map[string]interface {}
下面的程序,你可能注意到了一个问题:未使用的变量 n 编译会报错。
func main() {
var n int // “n 已声明且未使用”
n = 5 // 这也没用,还是会编译报错
}
../main.go:2:6: n 已声明且未使用
这是 Go 语言的一个特性
存在未使用的变量可能表明存在错误 […] 为了项目的构建速度和便利性以及程序的可读性,Go 语言拒绝使用未使用的变量和包。Go FAQ:我可以停止对未使用的变量 / 导入的投诉吗?](golang.org/doc/faq#unused_variable...)
但是 Go 语言,允许使用未使用的全局变量和函数参数。
解决方案:
如果你不想删除或注释掉一个未使用的变量或者包,则可以添加一个虚拟分配。
func main() {
var n int
n = 5
_ = n // n 现在被使用了
}
————————————————
golang中数组作函数参数,默认值传递,修改的数据不会影响原始数组,如要实现,可以
将数组以指针接受
使用slice
package main import "fmt" func arrayChange(a [3]int) { a[2] =3 fmt.Println(a) } func main() { var a = [...]int{3,4,5} arrayChange(a) fmt.Println(a) } //输出 [3 4 3] [3 4 5] 并不会改变原数组, 可使用指针 func arrayChange(a *[3]int) { a[2] =3 fmt.Println(a) } func main() { var a = [...]int{3,4,5} arrayChange(&a) fmt.Println(a) } 或slice func arrayChange(a []int) { a[2] =3 fmt.Println(a) } func main() { var a = []int{3,4,5} arrayChange(a) fmt.Println(a) }
https://www.bbsmax.com/A/x9J2QOMKz6/