golang语言中map的初始化及使用

YanJiangbo · 2015-02-13 15:00:02 · 312243 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2015-02-13 15:00:02 的文章,其中的信息可能已经有所发展或是发生改变。

// 先声明map
var m1 map[string]string
// 再使用make函数创建一个非nil的map,nil map不能赋值
m1 = make(map[string]string)
// 最后给已声明的map赋值
m1["a"] = "aa"
m1["b"] = "bb"

// 直接创建
m2 := make(map[string]string)
// 然后赋值
m2["a"] = "aa"
m2["b"] = "bb"

// 初始化 + 赋值一体化
m3 := map[string]string{
	"a": "aa",
	"b": "bb",
}

// ==========================================
// 查找键值是否存在
if v, ok := m1["a"]; ok {
	fmt.Println(v)
} else {
	fmt.Println("Key Not Found")
}

// 遍历map
for k, v := range m1 {
	fmt.Println(k, v)
}

						

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:YanJiangbo

查看原文:golang语言中map的初始化及使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

312243 次点击  ∙  4 赞  
加入收藏 微博
9 回复  |  直到 2020-08-25 09:43:03
bbuc
bbuc · #1 · 9年之前

为什么我初始化map[string]带名称的struct结构体{string:结构体构造}的时候出异常呢。很不懂

bbuc
bbuc · #2 · 9年之前
bbucbbuc #1 回复

为什么我初始化map[string]带名称的struct结构体{string:结构体构造}的时候出异常呢。很不懂

知道为什么了不在一行的时候最后一个要加,

peterchain
peterchain · #3 · 9年之前
package main

import (
    "fmt"
    "user"
)

type Person struct {
    ID      string
    Name    string
    Address string
}

func main() {
    userDB := make(map[string](*user.User)) //注意写法

    //初始化,注意对数组的初始化

    u := new(user.User)
    u.SetAge(12)
    u.SetName("张三")
    u.SetSex("男")
    u.SetPhone("15902783102")

    userDB["u1"] = u

    v, ok := userDB["u1"] //获取map值  key为'u1'
    if !ok {
        fmt.Println(" 没有找到信息")
        return
    }

    //打印出全部值 和各个分值
    fmt.Println(v.String())
    fmt.Printf("userDB[u1] = \n {name=%v \n age=%v \n sex=%v \n phone=%v \n}", v.GetName(), v.GetAge(), v.GetSex(), v.GetPhone())

    personDB := make(map[string]Person)
    var person = Person{"12346", "Xym", "bbb"}
    personDB["p1"] = person
    p, ok := personDB["p1"] //获取map值  key为'u1'
    if !ok {
        fmt.Println(" 没有找到信息")
        return
    }

    //打印出全部值 和各个分值
    fmt.Printf(" \n personDB[p1] = \n {ID=%v \n Name=%v \n address=%v \n}", p.ID, p.Name, p.Address)

    // 先声明map
    //var a map[string]string
    //a["b"] = "c" //这样会报错的,要先初始化内存
    //a = make(map[string]string)
    //a["b"] = "c" //这样才不会错

    var m1 map[string]string
    // 再使用make函数创建一个非nil的map,nil map不能赋值
    m1 = make(map[string]string)
    // 最后给已声明的map赋值
    m1["a"] = "aa"
    m1["b"] = "bb"
    m1["c"] = "cc"
    m1["d"] = "dd"
    fmt.Println("\n", m1) //输出元素的顺序是随机的,go语言中map是无序的

    // 直接创建
    m2 := make(map[string]string)
    m2["a"] = "aa"
    m2["b"] = "bb"
    fmt.Println("\n", m2)

    // 初始化 + 赋值一体化 注意最后一个元素后面也需要带上逗号的
    m3 := map[string]string{
        "a":  "aa",
        "b":  "bb",
        "c":  "cc",
        "xx": "xx",
        "d":  "dd", //注意最后一个元素后面也需要带上逗号的
    }
    fmt.Println("\n", m3)

    //删除一个key对应的元素 map的删除操作
    fmt.Println("删除之前", m3)
    delete(m3, "a")
    fmt.Println("删除之后", m3)

    //map的遍历
    fmt.Println("\n 遍历输出map")
    for k, v := range m3 {
        fmt.Printf("key=%v,val=%v \n", k, v) //无序的输出
    }
}
peterchain
peterchain · #4 · 9年之前
package user

import (
    "strconv"
)

type User struct {
    name  string
    age   int
    sex   string
    phone string
}

func (s *User) SetName(name string) {
    s.name = name
}

func (s *User) GetName() string {
    return s.name
}

func (s *User) SetAge(age int) {
    s.age = age
}

func (s *User) GetAge() int {
    return s.age
}

func (s *User) String() string {
    return "name is " + s.name + ",age is " + strconv.Itoa(s.age) + " ,sex=" + s.sex + " ,phone=" + s.phone
}

func (s *User) SetSex(sex string) {
    s.sex = sex
}

func (s *User) GetSex() string {
    return s.sex
}

func (s *User) SetPhone(phone string) {
    s.phone = phone
}

func (s *User) GetPhone() string {
    return s.phone
}

func (User) Print() string {
    return "print"
}
freezer-glp
freezer-glp · #5 · 7年之前
peterchainpeterchain #4 回复

```go package user import ( "strconv" ) type User struct { name string age int sex string phone string } func (s *User) SetName(name string) { s.name = name } func (s *User) GetName() string { return s.name } func (s *User) SetAge(age int) { s.age = age } func (s *User) GetAge() int { return s.age } func (s *User) String() string { return "name is " + s.name + ",age is " + strconv.Itoa(s.age) + " ,sex=" + s.sex + " ,phone=" + s.phone } func (s *User) SetSex(sex string) { s.sex = sex } func (s *User) GetSex() string { return s.sex } func (s *User) SetPhone(phone string) { s.phone = phone } func (s *User) GetPhone() string { return s.phone } func (User) Print() string { return "print" } ```

userDB := make(map[string](*user.User)) //注意写法  

personDB := make(map[string]Person)

@peterchain 为什么这两处,第一处user.User要用指针,第二处Person又不用指针了?

jasonzhang123
jasonzhang123 · #6 · 7年之前

我从一个新人的角度想想,估计是User中实现了很多函数,指定了接受者是(s *User),所以前者使用了指针,而后面的Persion就是个struct,没必要再用指针了,偷了点懒,哈哈

Schr0dingerCat
Schr0dingerCat · #7 · 7年之前

@peterchain @freezer-glp 有个问题,personDB := make(map[string]Person) 这个情况下,使用 personDB["p"].Name = "aaa" 这样赋值 会出现错误

jigetage
jigetage · #8 · 6年之前

。。。

leijux
leijux · #9 · 4年之前
Schr0dingerCatSchr0dingerCat #7 回复

@peterchain @freezer-glp 有个问题,personDB := make(map[string]Person) 这个情况下,使用 personDB["p"].Name = "aaa" 这样赋值 会出现错误

go不支持这个语法。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传