其他分享
首页 > 其他分享> > 【Golang】关于Go中一些常用的知识介绍

【Golang】关于Go中一些常用的知识介绍

作者:互联网

一、哪些类型可以作为map的key ?

1、可比较的类型都可以作为map key

2、不能作为map key 的类型包括

3、下面针对几种类型的比较做举例说明

package main

import (
	"fmt"
)

type Orange struct {
	Host string
	Port int
}

func main() {
	
	// 指针
	orange1 := Orange{}
	orange2 := Orange{}

	op11 := &orange1
	op12 := &orange1
	op2 := &orange2

	fmt.Println("op11 == op12 :", op11 == op12) // true
	fmt.Println("op11 == op2 :", op11 == op2) // false

	// 通道
	ch1 := make(chan int, 1)
	ch2 := ch1
	ch3 := make(chan int, 1)

	fmt.Println("ch1 == ch2 :", ch1 == ch2) // true
	fmt.Println("ch1 == ch3 :", ch1 == ch3) // false

	// 结构体
	orange3 := Orange{}
	orange4 := Orange{}
	orange5 := Orange{"host001", 22}

	fmt.Println("orange3 == orange4 :", orange3 == orange4) // true
	fmt.Println("orange3 == orange5 :", orange3 == orange5) // false

	// 数组
	a1 := [1]int{0}
	a2 := [1]int{0}

	fmt.Println("a1 == a2 :", a1 == a2) // true
}

输出结果

op11 == op12 : true
op11 == op2 : false
ch1 == ch2 : true
ch1 == ch3 : false
orange3 == orange4 : true
orange3 == orange5 : false
a1 == a2 : true 

二、关于make及切片slice、映射map详解

内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),使用make来创建slice,map,chanel说明如下:

1、make 创建slice

make([]Type, len, cap)

cap可以省略。当cap省略时,默认等于len。此外cap >= len >= 0的条件必须成立。例如,创建一个len和cap均为10的int型slice。

// 长度为5,容量为10的slice,slice中的元素是int
var slice_ []int = make([]int,5,10)
fmt.Println(slice_)

var slice_1 []int = make([]int,5)
fmt.Println(slice_1)

var slice_2 []int = []int{1,2}
fmt.Println(slice_2)

用第三个参数设置该slice的容量(即底层数组的长度)。如果能够预足容量,那么在slice中数据增长的过程中不需要更换底层数组(附带拷贝过程),这样效率更高。

2、make 创建 map

make(map[keyType] valueType, size)

keyType表示map的key类型,valueType表示map的value类型。size是一个整型参数,表示map的存储能力,该参数可省略。

var m_ map[string]int = make(map[string]int)
m_["one"] = 1
fmt.Println(m_)

var m map[string]int = map[string]int{"1":1}
m["2"] = 2
fmt.Println(m)  

根据 size 大小来初始化分配内存,不过分配后的 map 长度为 0,如果 size 被忽略了,那么会在初始化分配内存时分配一个小尺寸的内存

3、make 创建chanel

make(chan Type, size)

使用make创建channel,第一个参数是channel类型。size表示缓冲槽大小,是一个可选的大于或等于0的整型参数,默认size = 0。当缓冲槽不为0时,表示通道是一个异步通道。

package main
 
import "fmt"
 
func main() {
	demo := make(chan int, 10)
	fmt.Println("demo:", demo)
	// output: demo: map[]
	fmt.Println("len(demo):", len(demo))
	// output: len(demo): 0
	fmt.Println("cap(demo):", cap(demo))
	// output: cap(demo): 10

}

4、关于new函数

Go提供内建函数new

func new(Type) *Type

它只接受一个参数,这个参数是一个类型,分配好内存后,返回一个指向该类型内存地址的指针。同时请注意它同时把分配的内存置为零,也就是类型的零值。

func main() {
 var i *int
 i=new(int)
 *i=10
 fmt.Println(*i)
}

它返回的永远是类型的指针,指向分配类型的内存地址

5、注意事项 make和new的区别

6、映射map

//创建了一个键类型为string、值类型为PersonInfo
myMap = make(map[string] PersonInfo) 
//也可以选择是否在创建时指定该map的初始存储能力,创建了一个初始存储能力为100的map.
myMap = make(map[string] PersonInfo, 100) 
//创建并初始化map的代码.
myMap = map[string] PersonInfo{ 
  "1234": PersonInfo{"1", "Jack", "Room 101,..."}, 
} 

三、关于数组和切片的区别 ? 

以下代码输出什么?如果去掉注释又输出什么?

package main

import (
   "fmt"
)

func main() {
   a := [2]int{5, 6}
   b := [2]int{5, 6}

   if a == b {
      fmt.Println("equal")
   } else {
      fmt.Println("not equal")
   }

   /*
      if a[:] == b[:] {
          fmt.Println("equal")
      } else {
          fmt.Println("not equal")
      }
   */
}

输出:equal,去掉注释提示: invalid operation: a[:] == b[:] (slice can only be compared to nil)

go语言中数组和切片的区别

所以,a、b定义的是数组类型,数组对比是相同的,但是,a[:]、b[:]是切片,切片之间不能进行等值判断,只能和nil判断

 

标签:map,slice,int,make,知识,Golang,Println,Go,fmt
来源: https://www.cnblogs.com/chenpingzhao/p/16325398.html