函数返回值问题

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

常量不同于变量,在运行期间分配内存,常量在编译器预处理期就进行展开了,当做指令数据使用


文章内容学习自刘丹冰博客,点击访问原地址

分类: go

浙公网安备33011302000604

辽ICP备20003309号