代码改变世界

golang语法速记

2022-08-21 22:28  youxin  阅读(56)  评论(0编辑  收藏  举报

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 {}

 

Go 报错:变量未使用 —— xxx declared and not used

下面的程序,你可能注意到了一个问题:未使用的变量 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/