46 lines
		
	
	
		
			866 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
		
			866 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// For more tutorials: https://blog.learngoprogramming.com
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright © 2018 Inanc Gumus
							 | 
						||
| 
								 | 
							
								// Learn Go Programming Course
							 | 
						||
| 
								 | 
							
								// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package main
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"unsafe"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func main() {
							 | 
						||
| 
								 | 
							
									// empty := ""
							 | 
						||
| 
								 | 
							
									// dump(empty)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									hello := "hello"
							 | 
						||
| 
								 | 
							
									dump(hello)
							 | 
						||
| 
								 | 
							
									dump("hello")
							 | 
						||
| 
								 | 
							
									dump("hello!")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for i := range hello {
							 | 
						||
| 
								 | 
							
										dump(hello[i : i+1])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									dump(string([]byte(hello)))
							 | 
						||
| 
								 | 
							
									dump(string([]byte(hello)))
							 | 
						||
| 
								 | 
							
									dump(string([]rune(hello)))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// StringHeader is used by a string value
							 | 
						||
| 
								 | 
							
								// In practice, you should use: reflect.Header
							 | 
						||
| 
								 | 
							
								type StringHeader struct {
							 | 
						||
| 
								 | 
							
									// points to a backing array's item
							 | 
						||
| 
								 | 
							
									pointer uintptr // where it starts
							 | 
						||
| 
								 | 
							
									length  int     // where it ends
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// dump prints the string header of a string value
							 | 
						||
| 
								 | 
							
								func dump(s string) {
							 | 
						||
| 
								 | 
							
									ptr := *(*StringHeader)(unsafe.Pointer(&s))
							 | 
						||
| 
								 | 
							
									fmt.Printf("%q: %+v\n", s, ptr)
							 | 
						||
| 
								 | 
							
								}
							 |