函数返回值问题
func Func1(x,y int)(ret int,error){
return x+y,nil
}
func main() {
num, err := Func1(1, 2)
fmt.Println("num = ", num)
}
如上代码编译不通过,会报错如下
# command-line-arguments
.\test.go:7:29: syntax error: mixed named and unnamed parameters
- 在函数有多个返回值时,只要有一个返回值有指定命名,其他的也必须有命名。
- 如果返回值有有多个返回值必须加上括号;
- 如果只有一个返回值并且有命名也需要加上括号;
- 此处函数第一个返回值有ret名称,第二个未命名,所以错误。
结构体比较
package main
import "fmt"
func main() {
sn1 := struct {
age int
name string
}{age: 11, name: "qq"}
sn2 := struct {
age int
name string
}{age: 11, name: "qq"}
if sn1 == sn2 {
fmt.Println("sn1 == sn2")
}
sm1 := struct {
age int
m map[string]string
}{age: 11, m: map[string]string{"a": "1"}}
sm2 := struct {
age int
m map[string]string
}{age: 11, m: map[string]string{"a": "1"}}
if sm1 == sm2 {
fmt.Println("sm1 == sm2")
}
}
编译报错
# command-line-arguments
.\test.go:31:9: invalid operation: sm1 == sm2 (struct containing map[string]string cannot be compared)
只有相同类型结构体才可以比较, 结构体是否相同不但与属性有关,还与属性顺序有关
比如如下代码, stru1, stru2不是同一个结构体
stru1 := struct{
name int
age string
}{name:"xiaosheng", age:15}
stru2 := struct{
age int
name string
}{age:15, name:"xiaosheng"}
结构体是相同的, 但是结构体中含有不可以比较的类型,比如map, slice,不可以用比较
可以用reflect.DeepEqual比较
string, nil返回值问题
package main
import (
"fmt"
)
func GetValue(m map[int]string, id int) (string, bool) {
if _, exist := m[id]; exist {
return "存在数据", true
}
return nil, false
}
func main() {
intmap := map[int]string{
1: "a",
2: "bb",
3: "ccc",
}
v, err := GetValue(intmap, 3)
fmt.Println(v, err)
}
会编译报错,报错如下
# command-line-arguments
.\test.go:11:2: cannot use nil as type string in return argument
nil可以作为interface, map, pointer,slice, cnannel的空值,但是如果不特别指定,go不会识别其类型,会编译报错
func GetValue(m map[int]string, id int) (string, bool) {
if _, exist := m[id]; exist {
return "存在数据", true
}
return "", false
}
取地址问题
const v1 = 10
fmt.Println(&v1)
发生报错为
.\test.go:16:14: cannot take the address of v1
常量不同于变量,在运行期间分配内存,常量在编译器预处理期就进行展开了,当做指令数据使用
文章内容学习自刘丹冰博客,点击访问原地址