11

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

 3 years ago
source link: https://studygolang.com/articles/2379?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

YanJiangbo · 2015-02-13 15:00:02 · 212832 次点击 · 预计阅读时间 1 分钟 · 不到1分钟之前 开始浏览    
这是一个创建于 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)
}

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

280

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

9 回复  |  直到 2020-08-25 09:43:03

bbuc · #1 · 5年之前

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

bbuc · #2 · 5年之前

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

peterchain · #3 · 5年之前

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 · #4 · 5年之前

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 · #5 · 3年之前

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

personDB := make(map[string]Person)

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

jasonzhang123 · #6 · 3年之前

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

Schr0dingerCat · #7 · 3年之前

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

jigetage · #8 · 2年之前

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK