飞道的博客

go语言一天入门(下)

473人阅读  评论(0)

结构体

和c一样


  
  1. package main
  2. import "fmt"
  3. type Books struct {
  4. title string
  5. author string
  6. subject string
  7. book_id int
  8. }
  9. func main() {
  10. // 创建一个新的结构体
  11. fmt.Println(Books{ "Go 语言", "www.runoob.com", "Go 语言教程", 6495407})
  12. // 也可以使用 key => value 格式
  13. fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})
  14. // 忽略的字段为 0 或 空
  15. fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})
  16. }

  
  1. {Go 语言 www.runoob.com Go 语言教程 6495407}
  2. {Go 语言 www.runoob.com Go 语言教程 6495407}
  3. {Go 语言 www.runoob.com 0}

结构体指针,函数传参


  
  1. package main
  2. import "fmt"
  3. type Books struct {
  4. title string
  5. author string
  6. subject string
  7. book_id int
  8. }
  9. func main() {
  10. var Book1 Books /* Declare Book1 of type Book */
  11. var Book2 Books /* Declare Book2 of type Book */
  12. /* book 1 描述 */
  13. Book1.title = "Go 语言"
  14. Book1.author = "www.runoob.com"
  15. Book1.subject = "Go 语言教程"
  16. Book1.book_id = 6495407
  17. /* book 2 描述 */
  18. Book2.title = "Python 教程"
  19. Book2.author = "www.runoob.com"
  20. Book2.subject = "Python 语言教程"
  21. Book2.book_id = 6495700
  22. /* 打印 Book1 信息 */
  23. printBook(&Book1)
  24. /* 打印 Book2 信息 */
  25. printBook(&Book2)
  26. }
  27. func printBook( book *Books ) {
  28. fmt.Printf( "Book title : %s\n", book.title)
  29. fmt.Printf( "Book author : %s\n", book.author)
  30. fmt.Printf( "Book subject : %s\n", book.subject)
  31. fmt.Printf( "Book book_id : %d\n", book.book_id)
  32. }

  
  1. Book title : Go 语言
  2. Book author : www .runoob .com
  3. Book subject : Go 语言教程
  4. Book book_id : 6495407
  5. Book title : Python 教程
  6. Book author : www .runoob .com
  7. Book subject : Python 语言教程
  8. Book book_id : 6495700

切片

和py一样。


  
  1. package main
  2. import "fmt"
  3. func main() {
  4. var numbers [] int
  5. printSlice(numbers)
  6. /* 允许追加空切片 */
  7. numbers = append(numbers, 0)
  8. printSlice(numbers)
  9. /* 向切片添加一个元素 */
  10. numbers = append(numbers, 1)
  11. printSlice(numbers)
  12. /* 同时添加多个元素 */
  13. numbers = append(numbers, 2, 3, 4)
  14. printSlice(numbers)
  15. /* 创建切片 numbers1 是之前切片的两倍容量*/
  16. numbers1 := make([] int, len(numbers), ( cap(numbers))* 2)
  17. /* 拷贝 numbers 的内容到 numbers1 */
  18. copy(numbers1,numbers)
  19. printSlice(numbers1)
  20. }
  21. func printSlice(x []int){
  22. fmt.Printf( "len=%d cap=%d slice=%v\n", len(x), cap(x),x)
  23. }
  24. /*
  25. len=0 cap=0 slice=[]
  26. len=1 cap=1 slice=[0]
  27. len=2 cap=2 slice=[0 1]
  28. len=5 cap=6 slice=[0 1 2 3 4]
  29. len=5 cap=12 slice=[0 1 2 3 4]
  30. */

range

range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。


  
  1. package main
  2. import "fmt"
  3. func main() {
  4. //这是我们使用range去求一个slice的和。使用数组跟这个很类似
  5. nums := [] int{ 2, 3, 4}
  6. sum := 0
  7. for _, num := range nums {
  8. sum += num
  9. }
  10. fmt.Println( "sum:", sum)
  11. //在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
  12. for i, num := range nums {
  13. if num == 3 {
  14. fmt.Println( "index:", i)
  15. }
  16. }
  17. //range也可以用在map的键值对上。
  18. kvs := map[ string] string{ "a": "apple", "b": "banana"}
  19. for k, v := range kvs {
  20. fmt.Printf( "%s -> %s\n", k, v)
  21. }
  22. //range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
  23. for i, c := range "go" {
  24. fmt.Println(i, c)
  25. }
  26. }

 


  
  1. sum: 9
  2. index: 1
  3. a -> apple
  4. b -> banana
  5. 0 103
  6. 1 111

map

可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对


  
  1. package main
  2. import "fmt"
  3. func main() {
  4. var countryCapitalMap map[ string] string /*创建集合 */
  5. countryCapitalMap = make( map[ string] string)
  6. /* map插入key - value对,各个国家对应的首都 */
  7. countryCapitalMap [ "France" ] = "巴黎"
  8. countryCapitalMap [ "Italy" ] = "罗马"
  9. countryCapitalMap [ "Japan" ] = "东京"
  10. countryCapitalMap [ "India " ] = "新德里"
  11. /*使用键输出地图值 */
  12. for country := range countryCapitalMap {
  13. fmt.Println(country, "首都是", countryCapitalMap [country])
  14. }
  15. /*查看元素在集合中是否存在 */
  16. capital, ok := countryCapitalMap [ "American" ] /*如果确定是真实的,则存在,否则不存在 */
  17. /*fmt.Println(capital) */
  18. /*fmt.Println(ok) */
  19. if (ok) {
  20. fmt.Println( "American 的首都是", capital)
  21. } else {
  22. fmt.Println( "American 的首都不存在")
  23. }
  24. }

  
  1. France 首都是 巴黎
  2. Italy 首都是 罗马
  3. Japan 首都是 东京
  4. India 首都是 新德里
  5. American 的首都不存在

注:删除:delete(countryCapitalMap, "France")

语言类型转换

类型转换用于将一种数据类型的变量转换为另外一种类型的变量。Go 语言类型转换基本格式如下:

type_name(expression)

type_name 为类型,expression 为表达式。

如float32(5)等。

接口实例


  
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Phone interface {
  6. call()
  7. }
  8. type NokiaPhone struct {
  9. }
  10. func (nokiaPhone NokiaPhone) call() {
  11. fmt.Println( "I am Nokia, I can call you!")
  12. }
  13. type IPhone struct {
  14. }
  15. func (iPhone IPhone) call() {
  16. fmt.Println( "I am iPhone, I can call you!")
  17. }
  18. func main() {
  19. var phone Phone
  20. phone = new(NokiaPhone)
  21. phone.call()
  22. phone = new(IPhone)
  23. phone.call()
  24. }

在上面的例子中,我们定义了一个接口Phone,接口里面有一个方法call()。然后我们在main函数里面定义了一个Phone类型变量,并分别为之赋值为NokiaPhone和IPhone。然后调用call()方法,输出结果如下:

I am Nokia, I can call you!
I am iPhone, I can call you!

 


转载:https://blog.csdn.net/hebtu666/article/details/106196796
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场