如何在go中获取字符串变量的数据指针?

I want to get the data pointer of a string variable(like string::c_str() in c++) to pass to a c function and I found this doesn't work:

package main

/*
#include <stdio.h>
void Println(const char* str) {printf("%s
", str);}
*/
import "C"

import (
    "unsafe"
)

func main() {
    s := "hello"
    C.Println((*C.char)(unsafe.Pointer(&(s[0]))))
}

Compile error info is: 'cannot take the address of s[0]'. This will be OK I but I doubt it will cause unneccesary memory apllying. Is there a better way to get the data pointer?

C.Println((*C.char)(unsafe.Pointer(&([]byte(s)[0]))))

There are ways to get the underlying data from a Go string to C without copying it. It will not work as a C string because it is not a C string. Your printf will not work even if you manage to extract the pointer even if it happens to work sometimes. Go strings are not C strings. They used to be for compatibility when Go used more libc, they aren't anymore.

Just follow the cgo manual and use C.CString. If you're fighting for efficiency you'll win much more by just not using cgo because the overhead of calling into C is much bigger than allocating some memory and copying a string.