Go 自定义类型赋值疑问

package main

import (
    "fmt"
)

type Tint int
type Tstring string
type Tmap map[string]string
type Tmaps []map[string]string

func fooTint() int {
    return 1
}
func fooTstring() string {
    return "abc"
}
func fooTmap() map[string]string {
    return map[string]string{
        "id": "sss",
    }
}
func fooTmaps() []map[string]string {
    return []map[string]string{
        map[string]string{
            "id": "sss",
        },
    }
}

func main() {
    var tint Tint
    //这里不可以赋值,因为类型不一样
    tint = fooTint()
    fmt.Println(tint)


    var tstring Tstring
    //这里不可以赋值,因为类型不一样
    tstring = fooTstring()
    fmt.Println(tstring)


    var tmap Tmap
    //What?,可以赋值
    tmap = fooTmap()
    fmt.Println(tmap)


    var tmaps Tmaps
    //What?,可以赋值
    tmaps = fooTmaps()
    fmt.Println(tmaps)
}

为什么map类型可以赋值,而int string不可以,甚是奇怪

阅读 5.6k
2 个回答

因为在Go里面分为命名类型(named,所有使用type定义的类型都是命名类型,如int int64 string bool)和非命名类型(unamed map slice array),一个非命名类型可以赋值给一个命名类型,只要他们的结构相同
详见下面链接

https://stackoverflow.com/que...

int string 定义的类型的别名,其实只是和该类型的结构相同,所以要做类型转换的时候,还是需要进行显式转换的
map slice 是引用类型

golang 1.9 之后 你可以这样做

type Tint = int
type Tstring = string

这样就不会有问题。
希望对你有帮助

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题